Dzięki modułowi re
wydaje się, że nie jestem w stanie podzielić na mecze wzorców, które są puste ciągi:Python regex: dzielenie na wzór meczu, który jest ciągiem pustym
>>> re.split(r'(?<!foo)(?=bar)', 'foobarbarbazbar')
['foobarbarbazbar']
Innymi słowy, nawet jeśli dopasowanie zostanie znalezione, jeśli jest to pusty ciąg, nawet re.split
nie może podzielić ciągu znaków.
The docs for re.split
wydaje się wspierać moje wyniki.
A „obejście” było dość łatwe do znalezienia w tym konkretnym przypadku:
>>> re.sub(r'(?<!foo)(?=bar)', 'qux', 'foobarbarbazbar').split('qux')
['foobar', 'barbaz', 'bar']
Ale jest to sposób podatne na błędy to zrobić, bo wtedy mam uważać na ciągi, które już zawierają podciąg że jestem podział na:
>>> re.sub(r'(?<!foo)(?=bar)', 'qux', 'foobarbarquxbar').split('qux')
['foobar', 'bar', '', 'bar']
Czy istnieje lepszy sposób podzielić na pusty meczu wzór z modułem re
? Ponadto, dlaczego re.split
nie pozwala mi to zrobić w pierwszej kolejności? Wiem, że jest to możliwe z innymi algorytmami podziału, które działają z regex; na przykład mogę to zrobić za pomocą wbudowanego JavaScriptu String.prototype.split()
.
Podczas gdy metoda "findall" w drugiej odpowiedzi jest sprytna, wymaga powtórzenia schematu "foo" dwa razy w tym samym regex. Jeśli "foo" byłby faktycznie elementem zastępczym o dużo bardziej skomplikowanym wzorze, byłoby to całkowicie niepożądane. Ta odpowiedź jest najbardziej skalowalna i praktyczna dla skomplikowanych wyrażeń regularnych, a także nie wymaga instalowania żadnych dodatkowych modułów (co również eliminuje konieczność przekształcania istniejącego kodu do pracy z 'regex'), i dlatego właśnie zaakceptowanie tego jako najlepszej odpowiedzi. – Shashank
@Shashank dodał funkcję podziału, która działa poprawnie przy dopasowaniu szerokości zero i szerokości niezerowej –
Jak nieprawidłowy kod może polegać na czymś, co nie jest zaimplementowane? Jest bardzo mało obszarów, dla których Python obiektywnie jest do bani, i ten jeden świetny przykład. –