正则表达式中一些特殊构造

特殊构造

(?:…) (…)不分组版本,用于使用 | 或者后接数量词
(?iLmsux) iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个
(?#…) #号后的内容将作为注释
(?=…) 之后的字符串内容需要匹配表达式才能成功匹配
(?!…) 之后的字符串不匹配表达式才能成功
(?(?(?(id/name) yes |no) 如果编号为id/名字为name的组匹配到字符串,则需要匹配yes,否则匹配no,no可以省略

“(?:…)” :()里面有?:表示该()不是分组

1
2
3
4
5
>>> pat=re.compile(r'a(?:bc)')
>>> pat.findall('abc')
['abc']
>>> pat.match('abc').groups() #显示不出分组
()

“(?=…)”:匹配…表达式,返回。对后进行匹配,总是对后面进行匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> pat=re.compile(r'\w(?=\d)')  #匹配表达式\d,返回数字的前一位,\w:单词字符[A-Za-z0-9]
>>> pat.findall('abc1 def1 xyz1')
['c', 'f', 'z']
>>> pat.findall('zhoujy20130628hangzhou') #匹配数字的前一位,列表返回
['y', '2', '0', '1', '3', '0', '6', '2']
>>> pat=re.compile(r'\w+(?=\d)')
>>> pat.findall('abc1,def1,xyz1') #匹配最末数字的前字符串,列表返回
['abc', 'def', 'xyz']
>>> pat.findall('abc21,def31,xyz41')
['abc2', 'def3', 'xyz4']
>>> pat.findall('zhoujy20130628hangzhou')
['zhoujy2013062']
>>> pat=re.compile(r'[A-Za-z]+(?=\d)') #[A-Za-z],匹配字母,可以用其他的正则方法
>>> pat.findall('zhoujy20130628hangzhou123') #匹配后面带有数字的字符串,列表返回
['zhoujy', 'hangzhou']
>>> pat.findall('abc21,def31,xyz41')
['abc', 'def', 'xyz']

“(?!…)” 不匹配…表达式,返回。对后进行匹配

1
2
3
4
5
>>> pat=re.compile(r'[A-Za-z]+(?!\d)')    #[A-Za-z],匹配字母,可以用其他的正则方法
>>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310') #匹配后面不是数字的字符串,列表返回
['zhouj', 'hangzho', 'binjian'] #有疑问不应该是zhoujy吗?,因为y后面是数字,所以匹配到j终止
>>> pat.findall('abc21,def31,xyz41')
['ab', 'de', 'xy']

“(?<=…)”:匹配…表达式,总是对前面进行匹配

1
2
3
4
5
6
7
>>> pat=re.compile(r'(?<=\d)[A-Za-z]+')   #匹配前面是数字的字母
>>> pat.findall('abc21,def31,xyz41')
[]
>>> pat.findall('1abc21,2def31,3xyz41')
['abc', 'def', 'xyz']
>>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310')
['hangzhou']

“(?<!…)”:不匹配…表达式,总是对前面进行匹配

1
2
3
4
5
>>> pat=re.compile(r'(?<!\d)[A-Za-z]+')   #匹配前面不是数字的字母
>>> pat.findall('abc21,def31,xyz41')
['abc', 'def', 'xyz']
>>> pat.findall('zhoujy20130628hangzhou123,12,binjiang310')
['zhoujy', 'angzhou', 'binjiang']

“(?i)…”: …为表达式,这里就介绍下i参数:大小写区分匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> pat=re.compile(r'(?i)abc')      #(?i) 不区分大小写
>>> pat.findall('ABC')
['ABC']
>>> pat.findall('abc')
['abc']
>>> pat.findall('aBc')
['aBc']
>>> pat.findall('aBC')
['aBC']
>>> pat=re.compile(r'abc',re.I) #re.I 作为参数使用,推荐
>>> pat.findall('aBC')
['aBC']
>>> pat.findall('abc')
['abc']
>>> pat.findall('ABC')
['ABC']
hey!baby,站住,点它!