Вот самый простой способ объяснить это. Вот что я использую:
re.split('\W', 'foo/bar spam\neggs')
-> ['foo', 'bar', 'spam', 'eggs']
Вот что я хочу:
someMethod('\W', 'foo/bar spam\neggs')
-> ['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']
Причина в том, что я хочу разбить строку на токены, манипулировать ею, а затем снова соединить.
\W
? Я не смог на Google это.Ответы:
источник
['foo', '/bar', ' spam', '\neggs']
?re.split('% ', re.sub('% ', '%% ', '5.000% Additional Whatnot'))
->['5.000%', 'Additional Whatnot']
Если вы разделяете на новую строку, используйте
splitlines(True)
.(Не общее решение, но добавление этого здесь на случай, если кто-то придет сюда, не понимая, существует ли этот метод.)
источник
Еще одно решение без регулярных выражений, которое хорошо работает на Python 3
источник
Если у вас есть только 1 разделитель, вы можете использовать списки:
Добавление / добавление разделителя:
Разделитель как его собственный элемент:
источник
if x
чтобы убедиться , что кусок производстваsplit
имеет некоторое содержание, то есть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):]
другой пример, разделить на не буквенно-числовые и сохранить разделители
вывод:
объяснение
источник
\W
это более компактный способ выразить ее.Вы также можете разделить строку массивом строк вместо регулярного выражения, например так:
источник
источник
Одно ленивое и простое решение
Предположим, что ваш шаблон регулярного выражения
split_pattern = r'(!|\?)'
Сначала вы добавляете тот же символ, что и новый разделитель, например '[cut]'
new_string = re.sub(split_pattern, '\\1[cut]', your_string)
Затем вы разделяете новый разделитель,
new_string.split('[cut]')
источник
[cut]
где-то содержится .Если кто-то хочет разбить строку, сохраняя разделители регулярным выражением без захвата группы:
Если предположить, что регулярное выражение включено в группу захвата:
Оба способа также удалят пустые группы, которые бесполезны и раздражают в большинстве случаев.
источник
Вот простое
.split
решение, которое работает без регулярных выражений.Это ответ для Python split () без удаления разделителя , поэтому не совсем то, что просит исходная запись, но другой вопрос был закрыт как дубликат для этого.
Случайные тесты:
источник
У меня была похожая проблема, пытаясь разделить путь к файлу, и я пытался найти простой ответ. Это сработало для меня и не потребовало замены разделителей обратно в разделенный текст:
my_path = 'folder1/folder2/folder3/file1'
import re
re.findall('[^/]+/|[^/]+', my_path)
возвращает:
['folder1/', 'folder2/', 'folder3/', 'file1']
источник
re.findall('[^/]+/?', my_path)
(например, делая дополнительный слеш необязательным, используя?
вместо того, чтобы предоставлять две альтернативы|
.Я нашел этот подход на основе генератора более удовлетворительным:
Это избавляет от необходимости выяснять правильное регулярное выражение, в то время как в теории должно быть довольно дешево. Он не создает новые строковые объекты и делегирует большую часть итерационной работы эффективному методу поиска.
... а в Python 3.8 он может быть таким коротким как:
источник
заменить все
seperator: (\W)
наseperator + new_seperator: (\W;)
разделить на
new_seperator: (;)
источник