разделители не работают должным образом в методе разделения регулярных выражений - PullRequest
1 голос
/ 22 марта 2019
import re
text = 'The quick. black n brown? fox jumps*over the lazy dog.'
print(re.split('; |, |\? |. ',text))

Это дает мне вывод:

['Th', 'quick', 'brown', 'fo', 'jumps*ove', 'th', 'laz', 'dog.']

но я хочу, чтобы эта строка была разбита как

['The quick.', 'black n brown?', 'fox jumps*over the lazy dog.']

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Если я понял, что вам нужно, у вашего регулярного выражения должна быть экранированная точка:

print(re.split('; |, |\? |\. ',text)
0 голосов
/ 22 марта 2019

Вы можете использовать положительный вид нулевой ширины здесь:

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.

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