python正则表达式

特殊符号和字符

0x01 匹配多个正则表达式 |

管道符|,从多个模式中选择其一,正则模式at|home

>>> str = re.match("at|home","home")
>>> str.group()
'home'
>>> str = re.match("at|home","at qaq")
>>> str.group()
'at'

0x02 匹配任意单个字符 .

点号或者句点.符号匹配除了换行符\n以外的任意字符(python正则表达式有一个编译标记[S 或者 DOTALL],该标记能够推翻这个限制,使点号能够匹配换行符)。无论字母、数字、空格(不包括\n换行符)、可打印字符、不可打印字符,还是一个符号,使用点号都能匹配他们。

>>> str = re.match(".","a")
>>> str.group()
'a'

总结了一下常见的换行符和空格,经过测试,除了\n都能匹配

  • 换行符\v \n \f
>>> print("123\v456")
123
456
>>> print("123\n456")
123
456
>>> print("123\f456")
123
456
  • \t 制表符,四个空格,相当于table键
>>> print("123\t456")
123     456
  • \r将光标的位置回退到本行的开头位置
    在命令行实现倒计时功能
import time
for i in range(10):
    print("\r离程序退出还剩%s秒" % (9-i), end="")
    time.sleep(1)

在这里插入图片描述

0x03 从字符起始、结尾、边界匹配

  • 匹配起始位置:脱字符^、特殊字符\A
  • 匹配末尾位置:美元符号$、特殊字符\Z

后者主要用于没有脱字符的键盘,例如某些国际键盘

匹配以from起始的字符串

>>> str = re.match("^from.*","from home")
>>> str.group()
'from home'

匹配以end结尾的字符串

>>> str = re.match(".*end$","123end")
>>> str.group()
'123end'
  • \b 匹配一个字符的边界
  • \B 不是单词边界

任意以the开始的字符串

\bthe

只匹配单词the

\bthe\b

任何包含但不以the为起始的字符串

\Bthe

0x04 限定范围和否定

方括号中两个符号中间用连字符-连接 ,用于指定一个字符的范围,例如 a-z、A-Z或者0-9,如果脱字符紧跟在左方括号后面,则表示不匹配给定字符中的任意一个字符

匹配字母z后紧跟任何一个字符,然后跟一个数字

>>> re.match("z.[0-9]","z=3").group()
'z=3'
>>> re.match("[a-b][deh-j][y-z]","ahy").group()
'ahy'

匹配非元音字符

>>> re.match("[^aeiou]*","pygb").group()
'pygb'

0x04 使用闭包操作符实现存在性和频数匹配

  • * 匹配左边的表达式出现零次或者多次的情况。
  • + 一次或多次出现的正则表达式。
  • ? 匹配零次或一次出现的正则表达式。
  • {N}{M,N} 匹配前面的正则表达式N次,或匹配M-N次出现。

匹配15或者16位数字

[0-9]{15,16}

0x05 表示字符集的特殊字符

  • \d 匹配任何十进制数
  • \w 匹配全部字母数字,[A-Za-z0-9_]
  • \s 匹配空格字符
  • 以上大写版本表示不匹配,例如 \D表示任何非十进制数

匹配美国电话的格式例如800-555-1212

\d{3}-\d{3}-\d{4}

匹配qq邮箱

\d{5,10}@qq.com

0x06 圆括号指定分组

名字和姓氏

>>> re.match("(Mr?s?\.)?([A-Za-z]*[A-Za-z-]+)","Mr.chen").group(0)
'Mr.chen'
>>> re.match("(Mr?s?\.)?([A-Za-z]*[A-Za-z-]+)","Mr.chen").group(1)
'Mr.'
>>> re.match("(Mr?s?\.)?([A-Za-z]*[A-Za-z-]+)","Mr.chen").group(2)
'chen'

0x07 拓展表示法

没怎么看懂

参考《python核心编程》学习笔记(一):正则表达式扩展表示法

(?:\w+\.)* 以句点作为结尾的字符串,例如“google.”、“twitter.”、“facebook.”,但是这些匹配不会保存下来供后续的使用和数据检索

(?#comment) 此处不做匹配,只是作为注释

(?=.com) 如果一个字符串后面跟着“.com”才做匹配操作,并不使用任何目标字符串

(?!.net) 如果一个字符串后面不是跟着“.net”才做匹配操作

(?<=800-) 如果字符串之前为“800-”才做匹配,假定为电话号码,同样,并不使用任何输入字符串

(?<!192\.168\.) 如果一个字符串之前不是“192.168.”才做匹配操作,用来过滤掉一组C类IP地址

(?(1)y|x) 如果一个匹配组1存在,就与y匹配,否则与x匹配

总结来看,四种断言:

正向前行匹配(?=...) ##以某个字符串结尾

负向前行匹配(?!...) ##不以某个字符串结尾

正向后行匹配(?<=...) ##以某个字符串开头

负向后行匹配(?<!...) ##不以某个字符串开头

所谓的前行(lookahead)和后行(lookbehind),其实就是向前看和向后看的意思

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值