Python 3 – 正则表达式
正则表达式是一个特殊的字符序列,用于在模式中使用专门的语法来匹配或查找其他字符串或字符串集合。正则表达式在UNIX世界广泛使用。
模块 re 在Python中提供了对类似Perl的正则表达式的全面支持。如果在编译或使用正则表达式时发生错误,则模块 re 会引发异常 re.error 。
我们将介绍两个重要的函数,用于处理正则表达式。但是,小事情先:有各种字符,在正则表达式中使用时会具有特殊意义。为了避免在处理正则表达式时产生任何混淆,我们将使用原始字符串, r’expression’ 。
匹配单个字符的基本模式
序号 | 表达式和匹配 |
---|---|
1 | a、X、9、 < 普通字符仅完全匹配它们自己。 |
2 | .(句号) 匹配除换行符’\n’以外的任意单个字符 |
3 | \w 匹配“单词”字符:字母、数字或下划线[a-zA-Z0-9_] 。 |
4 | \W 匹配任何非单词字符。 |
5 | \b 单词和非单词之间的边界 |
6 | \s 匹配单个空格字符-空格、换行、回车、制表符 |
7 | \S 匹配任何非空格字符。 |
8 | \t、\n、\ 制表符、换行、回车 |
9 | \d 十进制数字[0-9] |
10 | ^ 匹配字符串的开头 |
11 | $ 匹配字符串的结尾 |
12 | \ 抑制字符的“特殊性”。 |
编译标志
编译标志使您可以修改正则表达式的某些工作方式。标志在re模块中有两个名称,一个是长名称,如 IGNORECASE ,另一个是短名称,如I。
序号 | 标志和含义 |
---|---|
1 | ASCII、A 只让\w、\b、\s和\d等转义符仅匹配具有各自属性的ASCII字符。 |
2 | DOTALL、S 让.匹配任何字符,包括换行符 |
3 | IGNORECASE、I 不区分大小写匹配 |
4 | LOCALE、L 执行符合当前区域设置的匹配 |
5 | MULTILINE、M 多行匹配,影响^和$ |
6 | VERBOSE、X(用于“扩展”) 启用详细正则表达式,可以更清晰地组织和理解 |
匹配函数
此函数尝试将RE pattern 与字符串 string 进行匹配,可选使用 flags 。
此函数的语法如下:-
re.match(pattern, string, flags = 0)
这是参数的描述 −
序号 | 参数及描述 |
---|---|
1 | pattern 这是要匹配的正则表达式。 |
2 | string 这是要搜索的字符串,以便在字符串开头匹配模式。 |
3 | 标志(flags) 您可以使用按位OR (|) 指定不同的标志。这些是下表中列出的修改器。 |
re.match函数在成功时返回一个match对象,在失败时返回None。我们使用match对象的group(num)或groups()函数来获取匹配的表达式。
序号 | 匹配对象方法和描述 |
---|---|
1 | group(num = 0) 这个方法返回整个匹配(或特定子组 num)。 |
2 | groups() 这个方法返回元组中的所有匹配的子组(如果没有则为空)。 |
示例
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print ("matchObj.group() : ", matchObj.group())
print ("matchObj.group(1) : ", matchObj.group(1))
print ("matchObj.group(2) : ", matchObj.group(2))
else:
print ("No match!!")
在执行上面的代码时,它将产生以下结果−
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
搜索功能
这个函数在字符串中搜索第一个出现的RE pattern,并返回可选的标志。
这里是该函数的语法 –
re.search(pattern, string, flags = 0)
下面是参数的描述-
序号 | 参数及描述 |
---|---|
1 | pattern 这是要匹配的正则表达式。 |
2 | string 这是要搜索的字符串,以便在字符串中的任意位置匹配模式。 |
3 | 标志(flags) 您可以使用按位OR(|)指定不同的标志。这些是下表中列出的修改器。 |
re.search函数在成功时返回一个match对象,在失败时返回None。我们使用match对象的group(num)或groups()函数来获取匹配的表达式。
序号 | 匹配对象方法和描述 |
---|---|
1 | group(num = 0) 这个方法返回整个匹配(或特定子组 num)。 |
2 | groups() 这个方法返回元组中的所有匹配的子组(如果没有则为空)。 |
示例
#!/usr/bin/python3
import re
line = "Cats are smarter than dogs";
# 在整个字符串中搜索匹配模式
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print ("searchObj.group() : ", searchObj.group()) # 返回匹配整个字符串的全部子串
print ("searchObj.group(1) : ", searchObj.group(1)) # 返回第一个匹配的字符串中的全部子串
print ("searchObj.group(2) : ", searchObj.group(2)) # 返回第二个匹配的字符串中的全部子串
else:
print ("Nothing found!!")
# match只在字符串的开始处匹配,search函数会在整个字符串中匹配
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("No match!!")
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
print ("search --> searchObj.group() : ", searchObj.group())
else:
print ("Nothing found!!")
phone = "2004-959-559 # This is Phone Number"
# 删除Python样式的注释
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)
# 删除非数字字符
num = re.sub(r'\D', "", phone)
print ("Phone Num : ", num)
当上述代码被执行时,会产生以下结果:
searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter
No match!!
search --> searchObj.group() : dogs
Phone Num : 2004-959-559
Phone Num : 2004959559
正则表达式修饰符:选项标志
正则表达式文字可以包含可选的修饰符以控制匹配的各个方面。修饰符被指定为可选标志。可以使用异或(|)提供多个修饰符,如前所述,并可以用以下之一表示:
序号 | 修改器和描述 |
---|---|
1 | re.I 进行不区分大小写的匹配。 |
2 | re.L 根据当前区域设置解释单词。这种解释会影响字母组(\w和\W)以及单词边界的行为(\b和\B)。 |
3 | re.M 使$匹配行的结尾(不仅仅是字符串的结尾),并使^匹配任何行的开头(不仅仅是字符串的开头)。 |
4 | re.S 使句点(点)与任何字符匹配,包括换行符。 |
5 | re.U 根据Unicode字符集解释字母。此标志会影响\w、\W、\b、\B的行为。 |
6 | re.X 允许“可爱”的正则表达式语法。它忽略空格(除了在集合[] 内或通过反斜杠转义时),并将未转义的#视为注释标记。 |
正则表达式模式
除了控制字符 (+?.*^$()[]{}|\)
外,所有字符都与自身匹配。您可以通过在其前面加上反斜杠来转义控制字符。
下表列出了Python中可用的正则表达式语法 –
这里是Python中常用的正则表达式语法列表。
序号 | 参数&描述 |
---|---|
1 | ^ 匹配行的开头。 |
2 | $ 匹配行的结束。 |
3 | . 匹配除换行符以外的任意单个字符。使用m选项可以匹配换行符。 |
4 | [...] 匹配方括号中的任意单个字符。 |
5 | [^...] 匹配不在方括号中的任意单个字符。 |
6 | re* 匹配0个或多个前面的表达式。 |
7 | re+ 匹配1个或多个前面的表达式。 |
8 | re? 匹配0个或1个前面的表达式。 |
9 | re{n} 匹配前面的表达式恰好n次。 |
10 | re{n,} 匹配前面的表达式n次或更多次。 |
11 | re{n,m} 匹配前面的表达式至少n次,最多m次。 |
12 | a|b 匹配a或b。 |
13 | (re) 捕获正则表达式并记住匹配的文本。 |
14 | (?imx) 临时在正则表达式中打开i、m或x选项。如果在括号内,则只影响该区域。 |
15 | (?-imx) 临时在正则表达式中关闭i、m或x选项。如果在括号内,则只影响该区域。 |
16 | (?: re) 捕获表达式但不记住已匹配的文本。 |
17 | (?imx: re) 临时在括号内打开i、m或x选项。 |
18 | (?-imx: re) 临时在括号内关闭i、m或x选项。 |
19 | (?#...) 注释。 |
20 | (?= re) 匹配位置使用模式。没有范围。 |
21 | (?! re) 运用模式否定指定位置。没有范围。 |
22 | (? > re) 匹配独立模式,无需回溯。 |
23 | \w 匹配单词字符。 |
24 | \W 匹配非单词字符。 |
25 | \s 匹配空格字符,等价于[\t\n\r\f]。 |
26 | \S 匹配非空格字符。 |
27 | \d | 27 | \d 匹配数字。等价于[0-9]。 |
28 | \D 匹配非数字。 |
29 | \A 匹配字符串开头。 |
30 | \Z 匹配字符串末尾。如果存在换行符,则匹配它前面。 |
31 | \z 匹配字符串末尾。 |
32 | \G 匹配上一个匹配结束的位置。 |
33 | \b 匹配单词边界,当在方括号外时。在方括号内部则匹配退格(0x08)。 |
34 | \B 匹配非单词边界。 |
35 | \n、\t 等等。 匹配换行符、回车符、制表符等。 |
36 | \1...\9 匹配第n个分组的子表达式。 |
37 | \10 匹配第n个分组的子表达式,如果它已匹配。否则参考字符码的八进制表示。 |
正则表达式示例
字面字符
序号 | 示例与说明 |
---|---|
1 | python 匹配 “python”。 |
字符类
序号 | 示例与说明 |
---|---|
1 | [Pp]ython 匹配 “Python” 或 “python”。 |
2 | rub[ye] 匹配 “ruby” 或 “rube”。 |
3 | [aeiou] 匹配任何一个小写元音字母。 |
4 | [0-9] 匹配任何一个数字;相当于 [0123456789] 。 |
5 | [a-z] 匹配任何一个小写 ASCII 字母。 |
6 | [A-Z] 匹配任何一个大写 ASCII 字母。 |
7 | [a-zA-Z0-9] 匹配以上任何一个。 |
8 | [^aeiou] 匹配除了小写元音字母以外的所有字符。 |
9 | [^0-9] 匹配除了数字以外的所有字符。 |
特殊字符类
序号 | 示例与说明 |
---|---|
1 | . 匹配任何字符,除了换行符。 |
2 | \d 匹配数字:[0-9] 。 |
3 | \D 匹配非数字:[^0-9] 。 |
4 | \s 匹配空白字符:[ \t\r\n\f] 。 |
5 | \S 匹配非空白字符:[^ \t\r\n\f] 。 |
6 | \w 匹配一个单词字符:[A-Za-z0-9_] 。 |
7 | \W 匹配一个非单词字符:[^A-Za-z0-9_] 。 |
重复
序号 | 示例与说明 |
---|---|
1 | ruby? 匹配 “rub” 或 “ruby”:y 是可选的。 |
2 | ruby* 匹配 “rub” 后面跟零个或多个 y。 |
3 | ruby+ 匹配 “rub” 后面跟一个或多个 y。 |
4 | \d{3} 匹配三个数字。 |
5 | \d{3,} 匹配三个或更多数字。 |
6 | \d{3,5} 匹配三个、四个或五个数字。 |
非贪婪重复
与贪婪重复不同,它匹配最小的重复次数 −
序号 | 示例与说明 |
---|---|
1 | <.*> 贪婪重复:匹配 <python>perl> 。 |
2 | <.*?> 非贪婪重复:匹配 <python> ,而不是 <python>perl> 。 |
带括号的分组
序号 | 示例及描述 |
---|---|
1 | \D\d+ 无分组: +重复\d |
2 | (\D\d)+ 分组: +重复\D\d组合 |
3 | ([Pp]ython(,)?)+ 匹配”Python”、”Python, python, python”等 |
回溯引用
这会再次匹配先前匹配的分组−
序号 | 示例及描述 |
---|---|
1 | ([Pp])ython &\1ails 匹配python&pails or Python&Pails |
2 | (['"])[^\1]*\1 单引号或双引号中的字符串。\1匹配第1组匹配的内容,\2匹配第2组匹配的内容,以此类推。 |
备选项
序号 | 示例及描述 |
---|---|
1 | python|perl 匹配”python”或”perl” |
2 | rub(y|le) 匹配”ruby”或”ruble” |
3 | Python(!+|\?) “Python”后面跟一个或多个!或一个? |
锚点
这需要指定匹配位置。
序号 | 示例及描述 |
---|---|
1 | ^Python 匹配一个字符串或内部行的开始处的”Python” |
2 | Python$ 匹配字符串或行末尾处的”Python” |
3 | \APython 匹配一个字符串的开头处的”Python” |
4 | Python\Z 匹配一个字符串的末尾处的”Python” |
5 | \bPython\b 在单词边界处匹配”Python” |
6 | \brub\B \B是非字边界: 匹配”rube”和”ruby”中的”rub”,但不匹配”rub”。 |
7 | Python(?=!) 匹配”Python”,如果后面紧跟感叹号。 |
8 | Python(?!!) 匹配”Python”,如果后面不是感叹号。 |
带圆括号的特殊语法
序号 | 示例及描述 |
---|---|
1 | R(?#comment) 匹配”R”。其余部分都是注释。 |
2 | R(?i)uby 区分大小写匹配”uby” |
3 | R(?i:uby) 和上面一样 |
4 | rub(?:y|le)) 只有分组,不创建\1回溯引用 |