Jak utworzyć takie wyrażenie regularne w Pythonie "(.*)"
, mając dane "a (b) c (d) e"
dopasowania w Pythonie "b"
zamiast "b) c (d"
?
Wiem, że mogę użyć "[^)]"
zamiast "."
, ale szukam bardziej ogólnego rozwiązania, które utrzyma moje wyrażenie regularne nieco bardziej przejrzystym. Czy jest jakiś sposób, aby powiedzieć Pythonowi „hej, dopasuj to tak szybko, jak to możliwe”?
python
regex
regex-greedy
So8res
źródło
źródło
*?
?Według dokumentów :
źródło
Nie
\\(.*?\\)
zadziała? To jest niechciwa składnia.źródło
Jak powiedzieli inni, używając? modyfikator na kwantyfikatorze * rozwiąże twój bezpośredni problem, ale bądź ostrożny, zaczynasz błądzić w obszarach, w których wyrażenia regularne przestają działać i zamiast tego potrzebujesz parsera. Na przykład napis "(foo (bar)) baz" spowoduje problemy.
źródło
Używanie niezbyt szczerego dopasowania to dobry początek, ale sugeruję również, abyś ponownie rozważył użycie
.*
- co z tym?źródło
Czy chcesz, aby pasowało do „(b)”? Zrób tak, jak sugerowali Zitrax i Paolo. Czy chcesz, aby pasowało do „b”? Robić
źródło
Na początek nie sugeruję używania „*” w wyrażeniach regularnych. Tak, wiem, jest to najczęściej używany separator wieloznakowy, ale mimo wszystko jest to zły pomysł. Dzieje się tak dlatego, że chociaż pasuje do dowolnej liczby powtórzeń dla tego znaku, „any” zawiera 0, co jest zwykle czymś, dla którego chcesz zgłosić błąd składni, a nie akceptować. Zamiast tego sugeruję użycie
+
znaku, który pasuje do każdego powtórzenia długości> 1. Co więcej, z tego, co widzę, masz do czynienia z wyrażeniami o stałej długości w nawiasach. W rezultacie prawdopodobnie możesz użyć{x, y}
składni, aby dokładnie określić żądaną długość.Jeśli jednak naprawdę potrzebujesz niechcianych powtórzeń, radzę skonsultować się z wszechmocnym
?
. To, po umieszczeniu po na końcu dowolnego specyfikatora powtórzenia wyrażenia regularnego, zmusi tę część wyrażenia regularnego do znalezienia najmniejszej możliwej ilości tekstu.Biorąc to pod uwagę, byłbym bardzo ostrożny z tym,
?
ponieważ podobnie jak Sonic Screwdriver w Dr. Who, ma tendencję do robienia, jak mam to ująć, „lekko” niepożądanych rzeczy, jeśli nie są dokładnie skalibrowane. Na przykład, aby użyć przykładowych danych wejściowych, zidentyfikowałoby((1)
(zwróć uwagę na brak drugiego rparena) jako dopasowanie.źródło