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

Vai*_*pai 14 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')
Run Code Online (Sandbox Code Playgroud)

但是......今天我在括号内看到了一个带有垂直条的表达式来定义相互排斥的模式 -

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

这似乎模仿了与上面相同的功能,或者我错过了什么?

PS:在Python括号中,它们用于定义匹配文本的逻辑组.如果我使用第二种技术,那么如何在两种工作中使用括号?

小智 22

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

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

^(hello|world)$
Run Code Online (Sandbox Code Playgroud)

将匹配"你好"或"世界"(并且只有这两个输入)

^[helloworld]$
Run Code Online (Sandbox Code Playgroud)

只会匹配一个字符("h"或"w"或"d"或其他).

快乐的编码.


Jim*_*lle 14

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