(?(id/name)yes-pattern|no-pattern)
先判断id或name是否存在,如果存在就使用yes-pattern规则来匹配;如果不存在,就使用no-pattern匹配。并且no-pattern是可选的,可以不存在。
例子:
print('(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)')
m = re.findall(u'(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)',
u'<a@t1.cn <a@t2.cn> a@t3.cn> a@t4.cn')
if m:
print(m)
结果输出如下:
(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)
[('<', 'a@t2.cn'), ('', 'a@t4.cn')]
下面来介绍转义字符,主要由‘\’和特定字符组成。如果指定的字符不在下面的列表里,re判断就会跳过‘\’,直接使用第二个字符作为判断。例如:\$在下面的字符里找不到,就以$来使用。
\number
匹配与数字序号相同的组,组的序号从1开始。例如(.+) \1就会匹配‘the the’或者‘55 55’,但不会匹配‘thethe’模式,因为(.+)与\1之间有一个空格,\1就是表示与(.+)相同匹配的组。这种方式只能匹配1到99组号,如果超过99就认为是八进制数,同时零开头的数字也认为是八进制数字。注意的是在方括号[]内的任何数字,包括转义字符都认为普通的字符处理。
例子如下:
print(r'(.+) \1')
m = re.findall(r'(.+) \1', r'abc abc abcabc 55 56 57 57')
if m:
print(m)
输出结果如下:
(.+) \1
['abc', '5', '57']
在这个例子里要注意的是正则表达式规则字符要使用r开头的原始字符串,或者采用双\\来表示数字,否则\1又表示别的字符了。
\A
表示仅从字符串的开始位置进行匹配。
例子如下:
print('\\Aabc')
m = re.findall(u'\Aabc', u'abc Aabc')
if m:
print(m)
m = re.findall(u'abc', u'abc Aabc')
if m:
print(m)
输出结果如下:
\Aabc
['abc']
['abc', 'abc']
从这里可以看到采用\A之后,只匹配一个,而没有这个标志就会匹配任何地方的abc。
\b
在一个单词之前或之后匹配空字符串。单词定义的字符范围是UNICODE的ASCII或者下划线,空字符串定义为空格、非ASCII和非下划线字符。例如r’\bcai\b’表示‘cai’,‘cai.’,‘(cai)’等匹配,而不匹配‘caimouse’,‘cai8’。
例子:
print(r'\b')
m = re.findall(r'\bcai\b', r'caimouse cai cai8')
if m:
print(m)
结果输出如下:
\b
['cai']
\B
在单词的开头或结尾匹配一个非空串。例如r’cai\B’表示匹配‘caimouse’,‘cai8’,‘cai_’,但不会匹配‘cai’,‘cai.’,‘cai!’。从这个意义来说与\b是刚好相反的。
例子:
print(r'\B')
m = re.findall(r'cai\B', r'caimouse cai cai8')
if m:
print(m)
结果输出如下:
\B
['cai', 'cai']
\d
在UNICODE模式之下:
匹配任何UNICODE的数字(在UNICODE里等同于[Nd])。包括[0-9],以及其它数字字符。如果设置ASCII标志,就仅限于[0-9],如果是这样,直接使用[0-9]的方式会更好。
在8位模式之下:
匹配任何数字字符,等同于[0-9]。
例子:
print(r'\d')
m = re.findall(r'cai\d', r'caimouse cai cai8')
if m:
print(m)
结果输出如下:
\d
['cai8']
\D
匹配任何非数字字符之外的字符,与\d的集合刚好相反。如果使用ASCII标志,与[^0-9]是相同的集合。不过使用ASCII标志之后,会影响整个正则表达式。如果只是想限制[^0-9]集合,直接使用这个会更好。
例子:
print(r'\D')
m = re.findall(r'cai\D', r'caimouse cai cai8')
if m:
print(m)
结果输出如下:
\D
['caim', 'cai ']
\s
在UNICODE模式之下:
匹配UNICODE分隔字符,包括空格、\t\n\r\f\v等等。
在8位模式之下:
匹配空格字符,同时也包括[\t\n\r\f\v]。
例子:
print(r'\s')
m = re.findall(r'cai\s', r'caimouse cai cai8')
if m:
print(m)
结果输出如下:
\s
['cai ']
\S
匹配任何非空格字符。与\s意义刚好相反。
例子:
print(r'\S')
m = re.findall(r'cai\S', r'caimouse cai cai8')
if m:
print(m)
输出结果如下:
\S
['caim', 'cai8']
\w
匹配任何非特定意义的字符。在8位的模式之下,就是与集合[a-zA-Z0-9]相同。
例子:
print(r'\w')
m = re.findall(r'cai\w', r'caimouse cai cai8')
if m:
print(m)
结果输出如下:
\w
['caim', 'cai8']
\W
匹配任何不组成词的字符。在8位模式之下,与[^a-zA-Z0-9]集合相同。
例子:
print(r'\W')
m = re.findall(r'cai\W', r'caimouse cai cai8')
if m:
print(m)
结果输出如下:
\W
['cai ']
\Z
只在字符结尾进行匹配。
例子:
print(r'\Z')
m = re.findall(r'cai\Z', r'caimouse\ncai')
if m:
print(m)
输出结果如下:
\Z
['cai']
蔡军生 QQ:9073204 深圳