正则表达式匹配中的差异b / w [ab]和(a | b)?

时间:2011-07-10 07:23:33

标签: python regex

我知道[]表示一组允许的字符 -

>>> 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括号中,它们用于定义匹配文本的逻辑组。如果我使用第二种技术,那么如何在两种工作中使用括号?

3 个答案:

答案 0 :(得分:20)

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

然而,交替不仅限于单个字符。例如,

^(hello|world)$

将匹配“hello”或“world”(以及这两个输入),而

^[helloworld]$

只匹配一个字符(“h”或“w”或“d”或其他)。

快乐的编码。

答案 1 :(得分:14)

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

答案 2 :(得分:3)

在你给出的例子中,它们是可以互换的。值得注意的是有一些差异:

在字符类方括号中,除了短划线或方括号或插入符号^之外,您不必转义任何内容(但只有当它是第一个字符时才会转义。)

括号捕捉匹配,以便您稍后可以参考。字符类匹配不会这样做。

您可以在括号中匹配多字符字符串,但不能在字符类中匹配