Разница 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
В примере, который вы указали, они взаимозаменяемы. Есть некоторые отличия, которые стоит отметить:
В квадратных скобках класса символов вам не нужно ничего избегать, кроме тире или квадратных скобок, или каретки ^ (но тогда только если это первый символ.)
Скобки фиксируют скобки, чтобы вы могли ссылаться на них позже. Символьные совпадения классов этого не делают.
Вы можете сопоставлять многосимвольные строки в круглых скобках, но не в классах символов