上次课我们讲到了用括号进行分组。 本次课我们来讲下匹配模式。
# 1.模式
模式修饰符即模式对应的单个字符,使用时将其填入特定结构(?modifier)中(其中 modifier 为模式修饰符),嵌在正则表达式的开头。比如不区分大小写的匹配模式对应的模式修饰符是 i,对 the 指定此模式,完整的正则表达式就是 (?i)the。
# 1.1 忽略大小写模式
不区分大小写的匹配模式对应的模式修饰符是 i。
import re
mo = re.search(r"(?i)robocop", "RoboCop is part man, part machine, all cop.")
mo.group()
1
2
3
4
2
3
4
import re
mo = re.search(r"(?i)robocop", "ROBOCOP protects the innocent.")
mo.group()
1
2
3
4
2
3
4
import re
mo = re.search(r"(?i)ROBOCOP", "Al, why does your programming book talk about robocop so much? ")
mo.group()
1
2
3
4
2
3
4
在上面三段代码中,由于指定了不区分大小写的匹配模式,所以正则表达式 (?i)robocop 可以匹配 RoboCop、ROBOCOP 和 robocop。
# 1.2 单行模式
点号几乎能匹配任何字符,唯有换行符 \n 除外。但是,有时候确实需要匹配“任何字符”,[\s\S] 是一种匹配任意字符的解决方式。但是,对大多数人来说,点号更加自然,也更简洁,所以正则表达式提供了单行模式。在这种模式下,所有文本似乎只在一行里,换行符是这一行中的“普通字符”,所以可以由点号匹配。单行模式对应的模式修饰符是 s,所以如果用模式修饰符,可以在表达式的开头用(?s)指定。
# 1.3 多行模式
“多行模式”听起来是与“单行模式”对应的,其实这两个模式没有任何联系。单行模式影响的是点号的匹配规则:在默认情况下,点号可以匹配除换行符之外的任何字符,在单行模式下,点号可以匹配包括换行符在内的任何字符;多行模式影响的是 ^ 和 $ 的匹配规则;在默认模式下,^ 和 $ 匹配的是整个字符串的起始位置和结束位置,但在多行模式下,它们也能匹配字符串内部某一行文本的起始位置和结束位置。多行模式的模式修饰符是 m,所以在表达式的开头用 (?m) 指定多行模式。
import re
multilineString = "1 line\nNot digit\n2 line"
for match in re.findall(r"(?m)^\d.*", multilineString):
print(match)
1
2
3
4
5
6
2
3
4
5
6
上面代码中,由于使用了多行模式,所以可以匹配每一个以数字开头的行。