2015-12-07 13 views
5

mam zdanie jak tenRegexp leniwy kwantyfikator

a something* q b c w 

i muszę dopasować się i q razem jak

(id_1: a, id_2: q) 

b sam jak

(id_1: b) 

i C i w razem jak (ID_1: C ID_2: w).

że próbuje użyć tego wyrażenia regularnego

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)?\b) 

powodu lazy operatora *? regexp tylko pierwszą część zdania, pasujące tylko

(id_1: a, id_1: b, id_1: c) 

Live Example

Jeśli używamy chciwy operatora tak, że ekspresja staje

(?:\b(?P<id_1>a|b|c)\b(?:.*)(?P<id_2>q|w)?\b) 

Live Example

It mecze

(id_1: a) 

wszystko po dopasowaniu jako . *.

Jeśli druga część jest obowiązkowe (z leniwa na *.):

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)\b) 

Live Example

pasuje zdań jak

(id_1: a, id_2: q);(id_1: b, id_2: w) 

jak oczekiwano.

Możliwe jest użycie wyrażeń regularnych, które "preferują" pasujących do całego zdania (w tym części opcjonalnej) lub które pasują tylko do pierwszej części TYLKO, jeśli brakuje opcjonalnej.

EDYCJA: Przepraszamy, że podane wyrażenia miały pewne błędy.

Ostatni regex jest:

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)\b) 

i wymaga zarówno grupę być obowiązkowe. Dopasowuje "coś * w", ale nie pasuje do "czegoś" * lub po prostu "a".Muszę dopasować "do czegoś * W" jak "a" i "AW" i dostać grupę pasujący odpowiednio:

(id_1: a , id_2: w) ; (id_1: a, id_2: none) ; (id_1:a , id_2: w) 

myślę, że regex wymagane jest:

(?:\b(?P<id_1>a|b|c)\b(?:.*?)(?P<id_2>q|w)?\b) 

ale w zdaniu "coś * w" pasuje tylko do "a" (z powodu leniwego operatora na. *).

Zaktualizowałem również wszystkie przykłady na żywo.

+1

nie Twoja ostatnia pasujące regex struny jest droga trzeba? Usunąłem 'b cw' i istnieje dopasowanie. Czy mógłbyś użyć 1 przykładu, aby opisać, co musisz w nim dopasować, a które regex jest najbliższe, czego brakuje? –

+0

Witaj @stribizhev, dzięki za pomoc. Edytowałem pytanie, ponieważ wystąpiły pewne błędy w wyrażeniach. Podałem również przykład w dziale EDIT. – Desh901

+0

Podobnie jak ['\ b (? P a | b | c) \ b (?: (?! \ B (?: Q | w) \ b).) * (? P q | w |) \ b '] (https://regex101.com/r/vU4wZ0/4)? A może, ['\ b (? P a | b | c) \ b (?: (?! \ B (?: Q | w) \ b).) * (? P q | w)? \ b'] (https://regex101.com/r/iP2pZ5/1)? –

Odpowiedz

1

Leniwe dopasowywanie kropek jest problematyczną przyczyną źródłową, ponieważ wymaga istnienia końcowej granicy.

Jeśli chcesz dopasować tekst, który nie jest konkretnym tekstem, możesz użyć dwóch rzeczy: albo wyostrzonego żarłocznego tokena albo regex opartego na unroll-the-loop.

Jeśli masz zmienne można użyć tempered greedy token i zrobić drugą grupę przechwytywania opcjonalnie z ? kwantyfikator:

\b(?P<id_1>a|b|c)\b(?:(?!\b(?:a|b|c|q|w)\b).)*(?P<id_2>q|w)?\b 
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^

Zobacz regex demo

+0

Jeśli masz wejście wielowierszowe, nie zapomnij użyć flagi 're.DOTALL' /' re.S', aby '.' mogło pasować do znaku nowej linii. –