正则表达式匹配中 [ab] 和 (a|b) 的区别是什么?

22

我知道[]表示可允许使用的字符集 -

>>> p = r'^[ab]$'
>>> 
>>> re.search(p, '')
>>> re.search(p, 'a')
<_sre.SRE_Match object at 0x1004823d8>
>>> re.search(p, 'b')
<_sre.SRE_Match object at 0x100482370>
>>> re.search(p, 'ab')
>>> re.search(p, 'ba')

但是...今天我遇到了一个在括号内使用竖杠定义互斥模式的表达式 -

>>> q = r'^(a|b)$'
>>> 
>>> re.search(q, '')
>>> re.search(q, 'a')
<_sre.SRE_Match object at 0x100498dc8>
>>> re.search(q, 'b')
<_sre.SRE_Match object at 0x100498e40>
>>> re.search(q, 'ab')
>>> re.search(q, 'ba')
这似乎模仿了上面的功能,或者我有什么遗漏吗?
PS:在Python中,圆括号本身用于定义匹配文本的逻辑组。如果我使用第二种技术,那么我如何同时使用圆括号?

不确定您所说的括号部分是什么意思... - user166390
1
是的,你说得对 - [ab](a|b) 都完全匹配相同的内容(但第一个会更快地匹配)。正则表达式本身就是一种语言(无论你在 Python 还是 Perl 中使用它们),如果你打算有效地使用它们,就需要学习它们(晦涩)的语法。例如,在正则表达式中的括号与正则表达式外的括号不同。我建议你跟随 regular-expressions.info 上的教程。在那里花费的任何时间都将得到多次回报。 - ridgerunner
3个回答

42

在这种情况下它是相同的。

但是,交替不仅限于单个字符。例如,

^(hello|world)$

将匹配"hello"或"world"(并且仅限这两个输入)


^[helloworld]$

只会匹配单个字符(如"h"或"w"或"d"等)。

编码愉快。


19

[ab]匹配一个字符(a或b),不捕获该组。 (a|b) 捕获a或b,并将其匹配。在这种情况下,没有太大的区别,但在更复杂的情况下,[]只能包含字符和字符类,而 (|)可以在管道的任一侧包含任意复杂的正则表达式。


4
在你提供的例子中,它们是可以互换使用的。但是有一些值得注意的区别:
在字符类方括号中,您不必转义除短划线或方括号以外的任何内容,或者插入符号^(但仅当它是第一个字符时)。
括号捕获匹配项,因此您可以稍后引用它们。字符类匹配不会这样做。
您可以在括号中匹配多个字符的字符串,但不能在字符类中这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接