我认为 pat1 = ‘[ab]’ 和 pat2 = ‘a|b’ 在 Python(python2.7, windows) ‘re’ 模块中与正则表达式模式具有相同的功能。但我对 ‘[ab]+’ 和 ‘(a|b)+’ 感到困惑,它们是否具有相同的功能,如果不是,您能解释一下细节吗?
''' Created on 2012-9-4 @author: melo ''' import re pat1 = '(a|b)+' pat2 = '[ab]+' text = '22ababbbaa33aaa44b55bb66abaa77babab88' m1 = re.search(pat1, text) m2 = re.search(pat2, text) print 'search with pat1:', m1.group() print 'search with pat2:', m2.group() m11 = re.split(pat1, text) m22 = re.split(pat2, text) print 'split with pat1:', m11 print 'split with pat2:', m22 m111 = re.findall(pat1, text) m222 = re.findall(pat2, text) print 'findall with pat1:', m111 print 'findall with pat2:', m222
输出如下:
search with pat1: ababbbaa search with pat2: ababbbaa split with pat1: ['22', 'a', '33', 'a', '44', 'b', '55', 'b', '66', 'a', '77', 'b', '88'] split with pat2: ['22', '33', '44', '55', '66', '77', '88'] findall with pat1: ['a', 'a', 'b', 'b', 'a', 'b'] findall with pat2: ['ababbbaa', 'aaa', 'b', 'bb', 'abaa', 'babab']
为什么’pat1’和’pat2’不同,它们有什么区别?’pat1’实际上可以匹配什么样的字符串?
在 Python 的re模块中,pat1 = '(a|b)+'和都匹配和的pat2 = '[ab]+'序列,但它们在捕获结果和分离匹配的方式上表现不同。a``b
re
pat1 = '(a|b)+'
pat2 = '[ab]+'
a``b
|
(a|b)``a``b``+``a``b``a``b
[ab]
a``b``+``[ab]``a``b
让我们看看中的每个方法如何与和re交互。pat1``pat2
pat1``pat2
re.search
re.search(pat1, text)
re.search(pat2, text)
ababbbaa
对于re.search,两种模式的行为类似,因为它们只是寻找第一个匹配并将其作为整体返回。
re.split
re.split(pat1, text)
a
b
(a|b)+
['22', 'a', '33', 'a', '44', 'b', '55', 'b', '66', 'a', '77', 'b', '88']
re.split(pat2, text)
['22', '33', '44', '55', '66', '77', '88']
这种差异是因为(a|b)+将每个a和b视为拆分的可能匹配,而将s 和s[ab]+的整个运行视为拆分的单个匹配。a``b
[ab]+
re.findall
re.findall(pat1, text)
findall
['a', 'a', 'b', 'b', 'a', 'b']
re.findall(pat2, text)
['ababbbaa', 'aaa', 'b', 'bb', 'abaa', 'babab']
在 中re.findall,(a|b)+匹配每个a或b作为序列中的单独元素,但只返回每组的最后一个字符(由于分组捕获规则),而匹配和 的[ab]+整个块。a``b
这样: