Как мне разделить строку на предложения, включая знаки препинания?

#regex #python-3.x #string #punctuation #sentence

#регулярное выражение #python-3.x #строка #пунктуация #предложение

Вопрос:

Я хочу, чтобы разделенные предложения включали знаки препинания (например: ?, !, .) и если в конце предложения есть двойные кавычки, я хочу включить и это.

Я использовал функцию re.split () в python3, чтобы разделить мою строку на предложения. Но, к сожалению, результирующие строки не содержат знаков препинания и не заключены в двойные кавычки, если они присутствуют в конце предложения.

Вот как выглядит мой текущий код:

 x = 'This is an example sentence. I want to include punctuation! What is wrong with my code? It makes me want to yell, "PLEASE HELP ME!"'
sentence = re.split('[.?!]s*', x)
  

Результат, который я получаю, это:

 ['This is an example sentence', 'I want to include punctuation', 'What is wrong with my code', 'It makes me want to yell, "PLEASE HELP ME', '"']
  

Ответ №1:

Попробуйте разделить при просмотре назад:

 sentences = re.split('(?<=[.?!])s*', x)
print(sentences)

['This is an example sentence.', 'I want to include punctuation!',
 'What is wrong with my code?', 'It makes me want to yell, "PLEASE HELP ME!"']
  

Этот трюк с регулярным выражением работает путем разделения, когда мы видим символ препинания сразу за нами. В этом случае мы также сопоставляем и используем любые пробелы перед нами, прежде чем продолжить ввод строки.

Вот моя посредственная попытка решить проблему с двойными кавычками:

 x = 'This is an example sentence. I want to include punctuation! "What is wrong with my code?"  It makes me want to yell, "PLEASE HELP ME!"'
sentences = re.split('((?<=[.?!]")|((?<=[.?!])(?!")))s*', x)
print filter(None, sentences)

['This is an example sentence.', 'I want to include punctuation!',
 '"What is wrong with my code?"', 'It makes me want to yell, "PLEASE HELP ME!"']
  

Обратите внимание, что оно корректно разделяет даже предложения, которые заканчиваются двойными кавычками.

Комментарии:

1. Извините, у меня была скобка перед «re», так что у вас она тоже есть в вашем коде. Пожалуйста, отредактируйте это. Что касается результата, все работает, кроме знака двойных кавычек в конце строки. Вы запустили свое? У вас это сработало? Для меня знак кавычки отображается как отдельный элемент в результирующем списке.

2. @investigate311 У меня не было этой проблемы . Мы можем скорректировать мой ответ, чтобы иметь дело с двойными кавычками.

3. Обновленная версия с двойными кавычками работает для меня! Я очистил строки None и empty с помощью цикла.