python re.split () пустая строка - PullRequest
0 голосов
/ 27 января 2019

Следующий пример взят из документов python re

re.split(r'\b', 'Words, words, words.')
['', 'Words', ', ', 'words', ', ', 'words', '.']

'\ b' соответствует пустой строке в начале или конце слова.Это означает, что если вы запустите этот код, он выдаст ошибку.

(jupyter notebook python 3.6)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-128-f4d2d57a2022> in <module>
      1 reg = re.compile(r"\b")
----> 2 re.split(reg, "Words, word, word.")

/usr/lib/python3.6/re.py in split(pattern, string, maxsplit, flags)
    210     and the remainder of the string is returned as the final element
    211     of the list."""
--> 212     return _compile(pattern, flags).split(string, maxsplit)
    213 
    214 def findall(pattern, string, flags=0):

ValueError: split() requires a non-empty pattern match.

Поскольку \ b соответствует только пустым строкам, split () не получает своего требования "непустое совпадение с образцом.Я видел разные вопросы, связанные с split () и пустыми строками.Некоторым я мог видеть, как вы можете захотеть сделать это на практике, например, вопрос здесь .Ответы варьируются от "просто не могу этого сделать" до (более старых) "это ошибка".

Мой вопрос такой:

  1. Так как это все ещеПример на веб-странице Python, это должно быть возможно?возможно ли это в выпуске с передовой?

  2. Вопрос в ссылке выше, касающейся re.split(r'(?<!foo)(?=bar)', 'foobarbarbazbar'), был задан в 2015 году, и не было никакого способа выполнитьтребования с re.split(), это все еще так?

1 Ответ

0 голосов
/ 28 января 2019

В Python 3.7 re, вы можете разделить на совпадения нулевой длины:

Изменено в версии 3.7 : добавлена ​​поддержка разделения нашаблон, который может соответствовать пустой строке.

Также обратите внимание, что

Пустые совпадения для шаблона разбивают строку, только если они не соседствуют с предыдущим пустым соответствием.

>>> re.split(r'\b', 'Words, words, words.')
['', 'Words', ', ', 'words', ', ', 'words', '.']
<pre>>>> re.split(r'\W*', '...words...')
['', '', 'w', 'o', 'r', 'd', 's', '', '']</p>

>>> re.split(r'(\W*)', '...words...')
['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', '']

Также с

re.split(r'(?<!foo)(?=bar)', 'foobarbarbazbar')

Я получаю ['foobar', 'barbaz', 'bar'] результат в Python 3.7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...