特殊序列
在正则表达式中可以使用各种的捕获组序列。它们被写成反斜杠,后面跟着另一个数字字符。
特殊序列是一个反斜杠和一个介于1到99之间的数字,比如: \1。数字自发表示捕获组的序列,也就是说我们可以在正则表达式里引用先前的捕获组。
import re
pattern = r"(.+)\1"
match = re.match(pattern, "word word")
if match:
print("Match 1")
match = re.match(pattern, "?! ?!")
if match:
print("Match 2")
match = re.match(pattern, "abc cde")
if match:
print("Match3")
--------------------------------------------------------
Match 1
Match 2
注意(.+)\1不等同于(.+)(.+),因为\1引用第一个组的表达式,即匹配表达式本身,而不是正则表达式。
特殊匹配
正则中还有一些特殊的匹配模式\d,\s,和\w,它们匹配数字,空白和单词字符。在ASCII模式里正则里等同[0-9],[\t\n\r\f\v]和[a-zA-Z0-9],但是在Unicode模式里\w匹配一个字。
如果我们把这几个字母变成大写\D,\S,和\W,那么意味着匹配模式相反。比如:\D匹配非数字。
import re
pattern = r"(\D+\d)"
match = re.match(pattern, "Hi 999!")
if match:
print("Match 1")
match = re.match(pattern, "1, 23, 456!")
if match:
print("Match 2")
match = re.match(pattern, "!$?")
if match:
print("Match 3")
----------------------------------------------------------------
Match 1
(\D+\d)意味着匹配一个或者多个非数字后面跟随一个数字。
还有一些特殊的匹配表达式\A,\Z,和\b。\A仅匹配字符串的开始,在大多数条件下,它的作用等同于在模式中使用^。\Z仅匹配字符串的结束,相当于$在大多数情况下。
\b匹配一个词的边界。一个词的边界就是一个词不被另一个词跟随的位置或者不是另一个词汇字符前边的位置,相当于\w和\W之间有一个空字符串。
\B匹配一个非单词边界。它匹配一个前后字符都是相同类型的位置:都是单词或者都不是单词。一个字符串的开始和结束都被认为是非单词。
import re
pattern = r"\b(cat)\b"
match = re.search(pattern, "The cat sat!")
if match:
print("Match 1")
match = re.search(pattern, "We s>cat>tered?")
if match:
print("Match 2")
match = re.search(pattern,"We scattered.")
if match:
print("Match 3")
----------------------------------------------------------
Match 1
Match 2
注意,一个匹配词的边界并不包括在匹配的内容中。换句话说,一个匹配的词的边界的内容的长度是0。"\b(cat)\b"。