Oto najprostszy sposób na wyjaśnienie tego. Oto czego używam:
re.split('\W', 'foo/bar spam\neggs')
-> ['foo', 'bar', 'spam', 'eggs']
Oto czego chcę:
someMethod('\W', 'foo/bar spam\neggs')
-> ['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']
Powodem jest to, że chcę podzielić ciąg na tokeny, manipulować nim, a następnie złożyć go ponownie.
\W
oznacza? Nie udało mi się google go.Odpowiedzi:
źródło
['foo', '/bar', ' spam', '\neggs']
?re.split('% ', re.sub('% ', '%% ', '5.000% Additional Whatnot'))
->['5.000%', 'Additional Whatnot']
Jeśli dzielisz na nową linię, użyj
splitlines(True)
.(Nie jest to ogólne rozwiązanie, ale dodanie tego tutaj na wypadek, gdyby ktoś tu przyszedł, nie zdając sobie sprawy z istnienia tej metody).
źródło
Kolejne rozwiązanie bez wyrażenia regularnego, które działa dobrze w Pythonie 3
źródło
Jeśli masz tylko 1 separator, możesz zastosować wyrażenia listowe:
Dołączanie / dodawanie separatora:
Separator jako jego własny element:
źródło
if x
aby upewnić się, że fragment wyprodukowany przezsplit
ma jakąś zawartość, tj.result = [x + sep for x in text.split(sep) if x]
result = [sep+x for x in data.split(sep)]
result[0] = result[0][len(sep):]
inny przykład, podziel na nie alfanumeryczne i zachowaj separatory
wynik:
wyjaśnienie
źródło
\W
jest to bardziej zwarty sposób na wyrażenie tego.Możesz również podzielić ciąg za pomocą tablicy ciągów zamiast wyrażenia regularnego, tak jak to:
źródło
źródło
Jedno leniwe i proste rozwiązanie
Załóżmy, że masz wzorzec wyrażenia regularnego
split_pattern = r'(!|\?)'
Najpierw dodajesz taki sam znak jak nowy separator, na przykład „[cut]”
new_string = re.sub(split_pattern, '\\1[cut]', your_string)
Następnie podzielisz nowy separator,
new_string.split('[cut]')
źródło
[cut]
gdzieś zawiera .Jeśli ktoś chce podzielić ciąg znaków, zachowując separatory przez wyrażenie regularne bez przechwytywania grupy:
Jeśli założymy, że wyrażenie regularne jest opakowane w grupę przechwytującą:
Oba sposoby usuwają również puste grupy, które w większości przypadków są bezużyteczne i irytujące.
źródło
Oto proste
.split
rozwiązanie, które działa bez wyrażenia regularnego.To jest odpowiedź na split () Python bez usuwania separatora , więc nie dokładnie to, o co pyta oryginalny post, ale drugie pytanie zostało zamknięte jako duplikat tego.
Losowe testy:
źródło
Miałem podobny problem, próbując podzielić ścieżkę pliku i próbowałem znaleźć prostą odpowiedź. To działało dla mnie i nie wymagało zastępowania ograniczników z powrotem w podzielonym tekście:
my_path = 'folder1/folder2/folder3/file1'
import re
re.findall('[^/]+/|[^/]+', my_path)
zwroty:
['folder1/', 'folder2/', 'folder3/', 'file1']
źródło
re.findall('[^/]+/?', my_path)
(np. Czyniąc ukośnik końcowy opcjonalnym przy użyciu?
zamiast zamiast dwóch alternatyw z|
.Uważam, że podejście oparte na generatorze jest bardziej satysfakcjonujące:
Pozwala to uniknąć konieczności znalezienia poprawnego wyrażenia regularnego, a teoretycznie powinno być dość tanie. Nie tworzy nowych obiektów łańcuchowych i przekazuje większość pracy iteracyjnej do wydajnej metody find.
... a w Pythonie 3.8 może być tak krótki, jak:
źródło
zastąpić wszystko
seperator: (\W)
zseperator + new_seperator: (\W;)
podzielone przez
new_seperator: (;)
źródło