元字符
\b是一个常用的元字符,他代表一个位置,用于指示单词的开始或结束。如我们想要寻找we,忽略大小写我们可能匹配到we,We,Welcome等位置,而\bwe\b则限定了寻找we而不是一个单词中的一部分。
如果我们想要匹配两个单词之间的所有字符呢?可以使用以下方法:\bwe\b.*\bus\b实现了匹配we与us之间的所有字符。其中.表示除换行符外的任意字符,*表示任意长度。

举例:文本we need to study in all our life,l3000,我们想获取以s开头的所有单词,可以使用如下正则式\bs\w*\b,如果我们要匹配l3000这样的字符串,应该使用^l\d*$。
字符转义
如果我们需要匹配元字符,则需要在元字符前加上转义字符\,如我们要匹配ftp:\127.0.0.1时,应写为ftp:\\\\127\.0\.0\.1。
重复限定符

字符集合
如要匹配比元字符更加限制的字符集合,则需要自定义字符集合。如在只考虑英文的情况下\w等价于[a-z0-9A-Z_]
分支条件
|或符表示分支,匹配时从左到右的正则式依次匹配,遇到相符正则式即停止
反义

括号分组
在正则式中,一个括号被认为是一个分组,从左到右第n组默认分配分组名n,如正则式((\d{1,3})\.){3}\d{1,3}可改写为((\d{1,3})\.){3}\2
自定义分组名,将\d+定义为Digit,可以使用(?<Digit>\d+)或(?'Digit'\d+),反向引用则使用\k<Digit>。

零宽断言
(?=exp)表示匹配到exp后取其前面的字符串;如we are cooking and singing使用[a-z]*(?=ing)匹配出cook和sing。单词反向匹配。
(?<=exp)表示匹配到exp后取其后面的字符串。从最左端匹配断言
(?!exp)表示此位置后不能跟exp,如\b((?!abc)\w)+\b 会在abc123 sddefsd123中匹配sddefsd123
(?<!exp)此位置前面不含exp
贪婪与懒惰
正则式匹配一般默认为贪婪模式,尽可能多的匹配,如在a23b73b中使用a\w*b会匹配整个字符串,若只想匹配少量子串可使用懒惰模式

Python与正则

Python中可以支持原生字符串\\\\可记为r'\\'.
import re
#首先使用compile生成对应正则式的pattern参数
pattern = re.compile(r'\d+')
#match
res = re.match(pattern,'326328wyegfwef')
print(res.group())
res = re.match(pattern,'c326328wyegfwef')
if res:
print(res.group())
else:
print("fail match")
#为了将捕获对象表示出来,使用了Match对象,以p和match为例
p = re.compile(r'(\w+) (\w+) (?P<word>.*)')
match = p.match('I Love You!')
print("match.string:",match.string) #需要匹配的文本
print("match.re",match.re) #正则式
print("match.pos:",match.pos) #匹配串的起始位置
print("match.endpos:",match.endpos) #匹配串的终止位置
print("match.lastindex:",match.lastindex) #匹配的最后一个分组索引
print("match.lastgroup:",match.lastgroup) #匹配的最后一个分组名
print("match.group(0):",match.group(0)) #匹配的所有分组实体
print("match.group(1,2):",match.group(1,2)) #匹配的第一第二分组实体
print("match.groups():",match.groups()) #分组元组
print("match.groupdict():",match.groupdict()) #有分组名的以字典形式表示
print("match.start(2):",match.start(2)) #第二个分组在字符串中的开始位置
print("match.end(2):",match.end(2))
print("match.span(2):",match.span(2))
print(r"match.expand(r'\2 \1 \3'):",match.expand(r'\2 \1 \3')) #原字符串分组后按expand中的新规则更改后给出对应值
#其他函数
pattern.search('sns8723sjdf8w38') #搜寻第一个为数字的序列返回match对象
pattern.split('sns8723sjdf8w38') #按数字序列分开字符串以列表形式返回
pattern.findall('sns8723sjdf8w38') #找到所有数字序列子串以列表形式返回
pattern.finditer('sns8723sjdf8w38') #找到所有数字序列以迭代器的形式返回所有match对象
pattern.sub(r'0','sns8723sjdf8w38') #利用r‘0’替换字符串中所有匹配的子串并返回字符串
326328
fail match
match.string: I Love You!
match.re re.compile('(\\w+) (\\w+) (?P<word>.*)')
match.pos: 0
match.endpos: 11
match.lastindex: 3
match.lastgroup: word
match.group(0): I Love You!
match.group(1,2): ('I', 'Love')
match.groups(): ('I', 'Love', 'You!')
match.groupdict(): {'word': 'You!'}
match.start(2): 2
match.end(2): 6
match.span(2): (2, 6)
match.expand(r'\2 \1 \3'): Love I You!
本文深入解析正则表达式的各种元素,包括元字符、转义、重复限定符、字符集合、分支条件、反义、括号分组、零宽断言、贪婪与懒惰模式。同时介绍了Python中如何使用正则表达式进行字符串处理,包括匹配、搜索、替换、分组等功能。

2万+

被折叠的 条评论
为什么被折叠?



