Mam silnik szablonów Pythona, który w dużym stopniu korzysta z wyrażenia regularnego. Używa konkatenacji, takich jak:
re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )
Potrafię modyfikować poszczególne podciągi (regexp1, regexp2 itp.).
Czy jest jakieś małe i lekkie wyrażenie, które nic nie pasuje, a którego mogę użyć wewnątrz szablonu, w którym nie chcę żadnych dopasowań? Niestety, czasami do atomu wyrażenia regularnego dołączane jest „+” lub „*”, więc nie mogę użyć pustego ciągu - spowoduje to błąd „nic do powtórzenia”.
Odpowiedzi:
To nie powinno do niczego pasować:
re.compile('$^')
Więc jeśli zamienisz regexp1, regexp2 i regexp3 na '$ ^', znalezienie dopasowania będzie niemożliwe. Chyba że używasz trybu wieloliniowego.
Po kilku testach znalazłem lepsze rozwiązanie
re.compile('a^')
Nie da się dopasować i zawiedzie wcześniej niż poprzednie rozwiązanie. Możesz zastąpić dowolną inną postać, a dopasowanie zawsze będzie niemożliwe
źródło
QtCore.QRegExp
. Tak źle, że z pewnością byłoby lżejsze do wykonania.(?!)
powinien zawsze nie pasować. Jest to ujemne antycypowanie o zerowej szerokości. Jeśli to, co jest w nawiasach, pasuje, to całe dopasowanie kończy się niepowodzeniem. Biorąc pod uwagę, że nic w nim nie ma, nie uda mu się dopasować niczego (w tym niczego).źródło
Aby dopasować pusty ciąg - nawet w trybie wielowierszowym - możesz użyć
\A\Z
, więc:re.compile('\A\Z|\A\Z*|\A\Z+')
Różnica polega na tym, że
\A
i\Z
są początkiem i końcem ciągu , podczas gdy^
i$
te mogą pasować do początku / końca linii , więc$^|$^*|$^+
potencjalnie mogą pasować do ciągu zawierającego znaki nowej linii (jeśli flaga jest włączona).Aby niczego nie dopasować (nawet pustego ciągu), po prostu spróbuj znaleźć treść przed jego początkiem, np .:
re.compile('.\A|.\A*|.\A+')
Ponieważ żadne znaki nie mogą występować przed \ A (z definicji), to zawsze nie pasuje.
źródło
Może
'.{0}'
?źródło
Możesz użyć
\z..
To jest bezwzględny koniec łańcucha, po którym następują dwa dowolne elementy
Jeśli
+
lub*
zostanie przypięty na końcu, to nadal działa, odmawiając dopasowania czegokolwiekźródło
\z
przeciwieństwie do IIRC nie zezwala na końcowe znaki nowej linii\Z
, więc czy jeden nie wystarczy? Lub to dziwna obrona przed*
(dlaczego się przed tymLub użyj funkcji składania list, aby usunąć bezużyteczne wpisy wyrażeń regularnych i połączyć je wszystkie razem. Coś jak:
re.compile('|'.join([x for x in [regexp1, regexp2, ...] if x != None]))
Pamiętaj jednak, aby dodać komentarze obok tego wiersza kodu :-)
źródło