2011-05-13 7 views
5

Zgodnie z pythonem doc, literały pionowe są używane jako operator "lub". Pasuje do A | B, gdzie A i B mogą być dowolnymi RE.W jaki sposób pionowe paski literalne określają formalny wyrażenie regularne w python?

Na przykład, jeśli wyrażenie regularne jest następujący: ABC | DEF, dopasowuje ciągi takie jak:

„ABC”, „DEF”

Ale co, jeśli chcę, aby dopasować ciągi jak następujące:

"ABCF", "Adef"

Być może to, co chcę jest coś A (BC) | (DE) F co oznacza:

  • mecz "A" pierwszy
  • następnie string "BC" czy "de",
  • następnie znak "F".

Wiem, że powyższe wyrażenie nie jest właściwe, ponieważ nawiasy mają inne znaczenie w wyrażeniu regularnym, tylko po to, by wyrazić mój pomysł.

Dzięki!

Odpowiedz

7

te będą działać:

A(BC|DE)F 
A(?:BC|DE)F 

Różnica jest liczba grup generowane: 1 z pierwszym, 0 z drugim.

wyrazami pasuje albo ABC lub DEF z 2 grupy, z których jedna zawiera nic i drugi zawierający dopasowaną fragment (BC lub DE).

+0

@ThomasH: Mylisz się. Testowałem to. –

+0

Masz rację. Używałem re-wyszukiwania i zakończyło się ono sukcesem, ale pasowało tylko do pod-ciągu "ABCF" lub "ADEF" (co prawdopodobnie nie było zamierzeniem PO). – ThomasH

+0

Interesującą rzeczą (o której nie wiedziałem) jest to, że '|' w 'A (BC) | (DE) F' faktycznie ma argumenty' A (BC) 'i' (DE) F', a nie tylko '(BC) 'i' (DE) '. – ThomasH

3

Jedyną różnicą między nawiasami w wyrażeń regularnych Pythona (i ogólnie wyrażeń regularnych w języku Perl) oraz nawiasami w formalnych wyrażeniach regularnych jest to, że w Pythonie parens przechowują swój wynik. Wszystko, co jest zgodne z wyrażeniem regularnym w nawiasach, jest przechowywane jako "podtyp" lub "grupa", do której można uzyskać dostęp za pomocą metody group w obiekcie dopasowania zwróconym przez re.match, re.search lub re.finditer. Są również używane w odsyłaczach wstecz, funkcja Python RE/PCRE, która narusza normalne reguły wyrażeń regularnych i prawdopodobnie nie dbasz o to.

Jeśli nie dbasz o ofertę ekstrakcji całej podstacji, możesz używać takich parensów. Jeśli ci na tym zależy, istnieje niezapisująca wersja parens, które są dokładnie takie same jak formalne wyrażenia regularne: (?:...) zamiast (...).

Ta, i więcej, jest opisane w official docs

Powiązane problemy