python_(re)正则表达式模块

本文详细介绍了Pythonre模块如何支持正则表达式,包括特殊字符的用法、匹配函数如compile、match、search、findall和split的使用方法,以及如何利用括号和组进行复杂匹配。


前言

re 模块支持正则表达式 (RE)。
该模块提供正则表达式匹配操作。
它支持 8 位和 Unicode 字符串;正在处理的模式字符串都可以包含 null 字节和 US ASCII 范围之外的字符。


特殊字符

正则表达式 RE 可以同时包含特殊字符普通字符。大多数普通字符,如“A”、“a”或“0”,是最简单的正则表达式;他们只是匹配自己。只连接普通字符,则 last 与字符串 ‘last’ 匹配。
特殊字符说明:
.
(点。) 在默认模式下,这匹配除换行符之外的任何字符。
*
0 次或多次重复匹配,尽可能多地重复。ab* 将匹配 ‘a’、‘ab’ 或 ‘a’,后跟任意数量的 ‘b’。
+
1 次或多次重复匹配。ab+ 将匹配“a”,后跟任何非零数的“b”;它不会只匹配“a”。
?
0 或 1 次重复匹配。ab?将匹配“a”或“ab”。
{m}
指定应与上一个 RE 的 m 个副本完全匹配;匹配项不足,会导致整个 RE 不匹配。例如,a{6} 将恰好匹配 6 个“a”字符,而不是 5 个。
{m,n}
使生成的 RE 匹配前一个 RE 的 m 到 n 次重复,尝试匹配尽可能多的重复。例如,a{3,5} 将匹配 3 到 5 个“a”字符。省略 m 指定零的下限,省略 n 指定无限上限。例如,a{4,}b 将匹配“aaaab”或一千个“a”字符,后跟“b”,但不匹配“aaab”。逗号不能省略,否则修饰符会与前面描述的形式混淆。

^
(插入符号)。匹配字符串的开头。
$
匹配字符串的末尾或字符串末尾的换行符之前,foo 同时匹配 ‘foo’ 和 ‘foobar’,而正则表达式 foo$ 仅匹配 ‘foo’。

[]
用于指示一组字符。在请中:

  • 字符可以单独列出,例如 [amk] 将匹配 ‘a’、‘m’ 或 ‘k’。
  • 字符范围可以通过给出两个字符并用“-”分隔来表示,例如 [a-z] 将匹配任何小写 ASCII 字母,[0-5][0-9] 将匹配从 00 到 59 的所有两位数字,而 [0-9A-Fa-f] 将匹配任何十六进制数字。如果 - 被转义(例如 [a\-z]),或者如果它被放置为第一个或最后一个字符(例如 [-a] 或 [a-]),它将匹配文字“-”。
  • 特殊字符在集合中失去了其特殊含义。例如,[(+)] 将匹配任何文字字符 ‘(’、‘+’、'’ 或 ‘)’。
  • 不在范围内的字符可以通过补充集合来匹配。如果集合的第一个字符是‘^’,则将匹配所有不在集合中的字符。例如,[ ^5 ] 将匹配除“5”以外的任何字符,而 [^^] 将匹配除“^”以外的任何字符。^ 如果它不是集合中的第一个字符,则没有特殊含义。
  • 若要匹配集合内的文字“]”,请在其前面加上反斜杠。

\
模式 pattern 中,很多字符有了特殊含义。
其中反斜杠‘\’最特殊,它除了作为转义字符,还有模式中特有的转义特殊字符含义,再是作为一个普通的文本反斜杠字符。
说明:
用一般字符串来表达模式:
转义字符:‘\’
转义特殊字符:‘\\’,需要两个反斜杠。
一个文本字符‘\’:‘\\\\’,四个反斜杠。

用原始字符串(raw,格式:r‘…’)来表达模式:
转义字符:‘\’,用来将模式中的特殊字符转为文本,还保留原本的作用。
转义特殊字符:‘\’,用一个反斜杠表示。
一个文本字符‘\’:‘\\’,将一个转义特殊字符转义为文本。

所以强烈建议所有模式使用原始字符串(r‘…’)

转义特殊字符‘\’的使用:
\b
匹配空字符串,但仅在单词的开头或结尾。单词被定义为单词字符序列。请注意,在形式上,b 被定义为 w 和 W 字符之间的边界。这意味着 r’\bfoob’ 匹配 ‘foo’, ‘foo.’, ‘(foo)’, ‘bar foo baz’ ,但不匹配 ‘foobar’ 或 ‘foo3’。
\B
匹配空字符串,但仅当它不在单词的开头或结尾时。这意味着 r’py\B’ 与 ‘python’、‘py3’、‘py2’ 匹配,但不匹配 ‘py’、‘py.’ 或 ‘py!’。B 与 b 正好相反。
\d
包括 [0-9] 以及许多其他数字字符。
\D
匹配任何不是十进制数字的字符。这与 d 相反,等效于 [^0-9]。
\s
匹配空格字符(包括 [ \t\n\r\f\v],以及许多其他字符,例如,许多语言中的排版规则规定的不间断空格)。
\S
匹配任何不是空格字符的字符。这与s相反,则等同于 [^ \t\n\r\f\v]。
\w
匹配 Unicode 单词字符;这包括字母、数字、字符、下划线。如果使用 ASCII 标志,则仅匹配 [a-zA-Z0-9_]。
\W
匹配任何不是单词字符的字符。这与 w 相反。如果使用 ASCII 标志,则等效于 [^a-zA-Z0-9_]。

|
A|B,其 中 A 和 B 可以是任意 RE,它创建一个与 A 或 B 匹配的正则表达式。任意数量的 RE 可以用 ‘|’ 以这种方式分隔。这也可以在组内使用。扫描目标字符串时,从左到右尝试以“|”分隔的 RE。当一个模式完全匹配时,该分支将被接受。这意味着一旦 A 匹配,B 将不会被进一步测试,即使它会产生更长的整体匹配。换句话说,“|”运算符从不贪婪。

(…)
匹配括号内的任何正则表达式,并指示组的开始和结束;在执行匹配后,可以检索组的内容,并且可以稍后在字符串中使用 number 特殊序列进行匹配,如下所述。

(?P<name>…)
分组起名。组名必须是有效的 Python 标识符,并且每个组名只能在正则表达式中定义一次。符号组也是一个编号组,就像该组未命名一样。

\number
匹配相同编号的组的内容。组从 1 开始编号。例如,(.+) \1 匹配 ‘the the’ 或 ‘55 55’,但不匹配 ‘thethe’(注意组后面的空格)。此特殊序列只能用于匹配前 99 个组中的一个。

(?P=name)
对命名组的反向引用;它与先前名为 name 的组匹配的任何文本匹配。(?P<name>.+) (?P=name) 匹配 ‘the the’ 或 ‘55 55’,但不匹配 ‘thethe’(注意组后面的空格)。


函数

re.compile(pattern)
将正则表达式模式编译为正则表达式对象,该对象可以使用其 match()、search() 和其他方法进行匹配,如下所述。

prog = re.compile(pattern)
result = prog.match(string)

等价于

result = re.match(pattern, string)

当表达式将在单个程序中多次使用时,使用 re.compile() 并保存生成的正则表达式对象以供重用会更有效。

re.search(pattern, string)
扫描字符串,查找正则表达式模式生成匹配的第一个位置,并返回相应的 Match。如果字符串中没有与模式匹配的位置,则返回 None。

re.match(pattern, string)
如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的 Match。如果字符串与模式不匹配,则返回 None。
请注意,re.match() 只会在字符串的开头匹配,而不是在每行的开头匹配。如果要在字符串中的任何位置找到匹配项,请改用 search()。

Match.group([group1, …])
返回匹配项的一个或多个子组。如果存在单个参数,则结果为单个字符串;如果有多个参数,则结果是一个元组,每个参数一个项目。如果没有参数,group1 默认为零(返回整个匹配项)。

m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
>>>m.group(0)       # The entire match
'Isaac Newton'
>>>m.group(1)       # The first parenthesized subgroup.
'Isaac'
>>>m.group(2)       # The second parenthesized subgroup.
'Newton'
>>>m.group(1, 2)    # Multiple arguments give us a tuple.
('Isaac', 'Newton')

re.findall(pattern, string)
以字符串或元组列表的形式返回字符串中模式的所有非重叠匹配项。从左到右扫描字符串,并按找到的顺序返回匹配项。结果中包含空匹配项。

>>>re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>>re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
[('width', '20'), ('height', '10')]

re.split(pattern, string, maxsplit=0, flags=0)
按模式的出现拆分字符串。如果在模式中使用捕获括号,则模式中所有组的文本也会作为结果列表的一部分返回。如果 maxsplit 为非零,则最多会发生 maxsplit 拆分,并且字符串的其余部分将作为列表的最后一个元素返回。

>>>re.split(r'\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>>re.split(r'(\W+)', 'Words, words, words.')  # 使用捕获括号
['Words', ', ', 'words', ', ', 'words', '.', '']
>>>re.split(r'\W+', 'Words, words, words.', 1) # maxsplit=1
['Words', 'words, words.']
>>>re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
['0', '3', '9']

Match.start([group])
Match.end([group])

返回按组匹配的子字符串的开头和结尾的索引;group 默认为零(表示整个匹配的子字符串),可以使用组别名 name。如果组存在但未参与匹配,则返回 -1。对于匹配对象 m 和确实有助于匹配的组 g,由组 g 匹配的子字符串(相当于 m.group(g))为

m.string[m.start(g):m.end(g)]
>>>email = "tony@tiremove_thisger.net"
>>>m = re.search("remove_this", email)
>>>email[:m.start()] + email[m.end():]
'tony@tiger.net'

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值