Вы можете использовать положительный вид нулевой ширины здесь:
re.split('(?<=[;,.?]) ',text)
(?<=[;,.?])
- положительный вид сзади нулевой ширины, который буквально соответствует любому из ;
, ,
, .
, ?
; за ним следует пробел для сопоставления
Пример:
In [1461]: text = 'The quick. black n brown? fox jumps*over the lazy dog.'
In [1462]: re.split(r'(?<=[;,.?]) ',text)
Out[1462]: ['The quick.', 'black n brown?', 'fox jumps*over the lazy dog.']
В вашей попытке, если вы замените .
(любой символ) на экранированную версию, чтобы получить литарал .
, т.е. \.
, вы получите ближе к желаемому выводу :
In [1463]: text = 'The quick. black n brown? fox jumps*over the lazy dog.'
In [1464]: re.split(r'; |, |\? |. ',text)
Out[1464]: ['Th', 'quick', 'blac', '', 'brown', 'fo', 'jumps*ove', 'th', 'laz', 'dog.']
In [1465]: re.split(r'; |, |\? |\. ',text)
Out[1465]: ['The quick', 'black n brown', 'fox jumps*over the lazy dog.']
Поскольку все шаблоны имеют отдельные символы, за которыми следует пробел, вы можете сделать шаблон более компактным, используя класс символов:
In [1466]: re.split(r'[;,?.] ',text)
Out[1466]: ['The quick', 'black n brown', 'fox jumps*over the lazy dog.']
Вам не нужно экранировать токены Regex внутри класса персонажей []
.
Кроме того, сделайте шаблоны Regex необработанными, заключив строку шаблона в r
.