Разница b/w [ab] и (a | b) в регулярном выражении?

Я знал, что [] обозначает набор допустимых символов -

>>> 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 скобки сами используются для определения логических групп совпадающего текста. Если я использую второй метод, то как использовать скобки для обоих заданий?

Ответ 1

В этом случае это одно и то же.

Однако чередование не ограничивается одним символом. Например,

^(hello|world)$

будет соответствовать "привет" или "мир" (и только эти два входа), а

^[helloworld]$

будет просто соответствовать одному символу ( "h" или "w" или "d" или еще что-то).

Счастливое кодирование.

Ответ 2

[ab] соответствует одному символу (a или b) и не отображает группу. (a|b) захватывает a или b и сопоставляет его. В этом случае нет большой разницы, но в более сложных случаях [] может содержать только символы и классы символов, а (|) может содержать произвольно сложное регулярное выражение по обе стороны от трубы

Ответ 3

В примере, который вы указали, они взаимозаменяемы. Есть некоторые отличия, которые стоит отметить:

В квадратных скобках класса символов вам не нужно ничего избегать, кроме тире или квадратных скобок, или каретки ^ (но тогда только если это первый символ.)

Скобки фиксируют скобки, чтобы вы могли ссылаться на них позже. Символьные совпадения классов этого не делают.

Вы можете сопоставлять многосимвольные строки в круглых скобках, но не в классах символов