Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否';[ab]+';相等';(a | b)及"x2B ;';在pythonre模块中?_Python_Regex_Python 2.7 - Fatal编程技术网

是否';[ab]+';相等';(a | b)及"x2B ;';在pythonre模块中?

是否';[ab]+';相等';(a | b)及"x2B ;';在pythonre模块中?,python,regex,python-2.7,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 = '22ababbbaa33aaa44b55bb66abaa77ba

我认为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”实际上可以匹配什么类型的字符串?

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

根据,

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

尝试使群不被捕获,看看是否得到了预期的结果:

pat1 = '(?:a|b)+'

我可以用MacOSX10.7.4上的Python2.7.1确认这种行为。我无法立即解释这种行为。如果您将
pat1
更改为
((a | b)+
,然后重新运行测试,您将得到完全不同的输出。这与将
()
作为正则表达式中的分组/捕获操作符有关。但我不完全确定是什么——我觉得有点懒,这就是为什么这是一个注释而不是答案。@JonathanLeffler是的,如果你将
pat2
更改为
([ab]+)
,你会得到同样的输出。那么谁能解释
)的行为呢?@user1477871我想你的意思是你会得到与
([ab])+
相同的输出,而不是
([ab]+)
。有一个重要的区别。@Wiseguy是的,没错,没错。此外,对于重复组,只返回最后一次捕获。对于
re.findall()
,还有另一个区别:如果没有捕获组,则返回整个匹配。否则,只返回捕获组的内容。