Python正则表达式详解

正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。
1950 年,数学家斯蒂芬·科尔·克莱尼利用称之为“正则集合”的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器 QED,随后是 UNIX 上的编辑器 ed,并最终引入 grep。自此以后,正则表达式被广泛地应用于各种 UNIX 或类 UNIX 系统的工具中。目前,许多程序设计语言都支持利用正则表达式进行字符串操作。
一个正则表达式通常被称为一个模式(pattern),是用来描述或者匹配一系列匹配某个句法规则的字符串。例如 Polish、Spanish 和 Swedish 这三个字符串,都可以由(Pol|Span|Swed)ish 这个模式来描述。
大部分正则表达式的形式都有如下的结构:
1) 选择 竖线 | 表示选择,具有最低优先级,例如 center|centre 可以匹配 center 或 centre。
2) 数量限定 字符后的数量限定符用来限定前面这个字符允许出现的个数。最常见的数量限定符包括“+”“?”和“*”(不加数量限定则代表出现一次且仅出现一次): 加号 + 代表前面的字符必须至少出现一次(一次或多次),例如 goo+gle 可以匹配 google、gooogle、goooogle 等。 问号 代表前面的字符最多只可以出现一次(零次或一次),例如 colou?r 可以匹配 color 或者 colour。 星号 * 代表前面的字符可以不出现,也可以出现一次或者多次(零次、一次或多次),例如 0*42 可以匹配 42、042、0042、00042 等。 3) 匹配 成对的小括号 ( ) 用来定义操作符的范围和优先度,例如 gr(a|e)y 等效于 gray|grey,(grand)?father 匹配 father 和 grandfather。
正则表达式中除了上述的几种特殊字符外,还使用了一些特殊的方式表示匹配的模式,常用的特殊字符及含义如表 1 所示。
表 1:正则表达式常用的特殊字符及含义 将下一个字符标记为一个特殊字符、一个原义字符(Identity Escape,有 "^"  "$"  "("   ")"  "*"  "+"  "{"  "|" 共计12个)、一个向后引用(backreferences)或一个八进制转义符。例如“n”匹配字符“n”,“\n”匹配一个换行符,“\\”匹配“\”,“\(”则匹配“(”
str = '<span>abcd</span><span>abcdef</span> '
pattern ='<span>.*</span>'
p = re.compile(pattern)
match = re.search(p, str)
print(match.group(0))

上述代码的运行结果如下所示: >>> import re
>>> str = '<span>abcd</span><span>abcdef</span> '
>>> pattern ='<span>.*</span>'
>>> p = re.compile(pattern)
>>> match = re.search(p, str)
>>> print(match.group(0))
<span>abcd</span><span>abcdef</span>

在正则表达式中使用“*”匹配字符串默认是匹配到串的结尾,即所谓的“贪婪模式”。如果只想匹配到第一个符合条件的子字符串就停止,需要切换为“非贪婪模式”,方法是在“*”之后使用“?”,例如: import re
str = '<span>abcd</span><span>abcdef</span> '
pattern ='<span>.*?</span>'
p = re.compile(pattern)
match = re.search(p, str)
print(match.group(0))

上述代码的运行结果如下所示: >>> import re
>>> str = '<span>abcd</span><span>abcdef</span> '
>>> pattern ='<span>.*?</span>'
>>> p = re.compile(pattern)
>>> match = re.search(p, str)
>>> print(match.group(0))
<span>abcd</span>

可见,“贪婪模式”在整个表达式匹配成功的前提下,尽可能多地匹配;而“非贪婪模式”在整个表达式匹配成功的前提下,尽可能少地匹配。“贪婪模式”与“非贪婪模式”影响的是被量词修饰的子表达式的匹配行为。
Python中正则表达式常用的方法如表 3 所示。
表 3:正则表达式常用的方法 compile() 编译正则表达式模式,返回一个对象的模式 match() 决定正则表达式对象是否在字符串最开始的位置匹配。注意:该方法不是完全匹配。当模式结束时若 原字符串还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符“$” search() 在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回“None” findall() 遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表 finditer() 返回一个顺序访问每一个匹配结果的迭代器,该方法将找到匹配正则表达式的所有子串 split() 按照能够匹配的子串将原字符串分割后返回列表 sub() 替换原字符串中每一个匹配的子串后返回替换后的字符串 subn() 返回“sub()”方法执行后的替换次数 flags() 正则表达式编译时设置的标志 pattem() 正则表达式编译时使用的字符串