python re模块中'[ab] +'是否等于'(a | b)+'?

ims*_*rch 10 python regex python-2.7

我认为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
Run Code Online (Sandbox Code Playgroud)

输出如下:

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']
Run Code Online (Sandbox Code Playgroud)

为什么'pat1'和'pat2'不同,它们的区别是什么?什么样的字符串可以'pat1'实际匹配?

Wis*_*guy 10

您在第一个模式中有一个捕获组.

根据文件,

re.split()
...如果在模式中使用捕获括号,则模式中所有组的文本也将作为结果列表的一部分返回....

尝试使群组无法捕捉,看看你是否得到了你所期望的:

pat1 = '(?:a|b)+'
Run Code Online (Sandbox Code Playgroud)

  • 使用`re.findall()`,还有另一个区别:如果没有捕获组,则返回整个匹配.否则,仅返回捕获组的内容. (2认同)