2011-07-10 11 views
10

Wiedziałem, że [] oznacza zbiór dopuszczalnych znaków -różnica b/w [ab] i (a | b) w dopasowaniu do wyrażenia regularnego?

>>> 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') 

... Ale dzisiaj natknąłem się na wypowiedzi z pionowych barów w nawiasie definiują wzajemnie wykluczające Patterns -

>>> 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') 

Wydaje się to naśladować tę samą funkcjonalność co powyżej, czy też czegoś mi brakuje?

PS: W Python nawiasie sami są wykorzystywane do definiowania grup logicznych dopasowanego tekstu. Jeśli używam drugiej techniki, to w jaki sposób użyć nawiasów dla obu zadań?

+0

nie wiesz o co ci chodzi z bitem nawiasie ... –

+1

Tak, masz rację - '[ab]' i '(a | b) "obaj dopasowują _exactly_ to samo (ale pierwszy dopasuje się szybciej). Wyrażenia regularne są językiem samym w sobie (niezależnie od tego, czy znajdujesz je w Pythonie czy Perlu) i musisz nauczyć się ich (tajemniczej) składni, jeśli zamierzasz z nich efektywnie korzystać. (Np Nawiasy wewnątrz regexpa nie jest taka sama jak poza regex nawiasach). I zalecane po kursie w [regular-expressions.info] (http://www.regular-expressions.info). Każdy spędzony tam czas będzie wielokrotnie nagradzany. – ridgerunner

Odpowiedz

16

W tym przypadku jest taki sam.

jednak naprzemienne nie ogranicza się tylko do jednego znaku. Na przykład,

^(hello|world)$ 

dopasuje "cześć" lub "świat" (i tylko te dwa wejścia), natomiast

^[helloworld]$ 

po prostu pasuje do pojedynczego znaku ("h" lub "W" lub "d" lub cokolwiek).

Szczęśliwe kodowanie.

13

[ab] dopasowuje jeden znak (A lub B), a nie uchwycić grupę. (a|b) przechwytuje symbol a lub b i dopasowuje go. W tym przypadku nie ma dużej różnicy, ale w bardziej złożonych przypadkach [] może zawierać tylko znaki i klasy znaków, a (|) może zawierać dowolnie złożone wyrazy regularne po obu stronach rury.

3

W podanym przykładzie są one zamienne. Istnieją pewne różnice warto zauważyć:

W klasie znaków nawiasów kwadratowych nie ma ucieczki niczego poza odrobiną lub nawiasach kwadratowych lub karetki^

(ale tylko wtedy, gdy jest to pierwszy znak).

Nawiasy przechwytują mecze, dzięki czemu możesz się do nich odnieść później. Mecze klas postaci nie robią tego.

można dopasować ciągi wieloznakowych w nawiasach, ale nie w klasach znaku

Powiązane problemy