Разделение предложений на основе разных шаблонов в Python 3

#python #regex #python-3.x #recursion

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

Вопрос:

Мне нужно разделить строки на основе последовательности шаблонов регулярных выражений. Я могу применять разделение по отдельности, но проблема заключается в рекурсивном разделении разных предложений.

Например, у меня есть это предложение:

 "I want to be splitted using different patterns. It is a complex task, and not easy to solve; so, I would need help."
  

Мне нужно было бы разделить предложение на основе «,», «;» и «.».

Результатом должно быть 5 предложений, таких как:

 "I want to be splitted using different patterns."
"It is a complex task,"
"and not easy to solve;"
"so,"
"I would need help."
  

Мой код пока:

 import re
sample_sentence = "I want to be splitted using different patterns. It is a complex task, and not easy to solve; so, I would need help."
patterns = [re.compile('(?<=.) '),
            re.compile('(?<=,) '),
            re.compile('(?<=;) ')]
for pattern in patterns:
    splitted_sentences = pattern.split(sample_sentence)
    print(f'Pattern used: {pattern}')
  

Как я могу применить разные шаблоны без потери результатов и получить ожидаемый результат?

Редактировать: мне нужно запускать каждый шаблон один за другим, так как мне нужно выполнить некоторые проверки в результате каждого шаблона, поэтому запускаю его в каком-то древовидном алгоритме. Извините, что не объяснил полностью, в моей голове это было ясно, но я не думал, что это будет иметь побочные эффекты.

Ответ №1:

Вы можете объединить каждый шаблон с | :

 import re
s = "I want to be splitted using different patterns. It is a complex task, and not easy to solve; so, I would need help."
result = re.split('(?<=.)s|,s*|;s*', s)
  

Вывод:

 ['I want to be splitted using different patterns.', 'It is a complex task', 'and not easy to solve', 'so', 'I would need help.']
  

Ответ №2:

Python имеет это в re

Попробуйте

 re.split('; | , | . ',ourString)
  

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

1. Вместо этого это не генерирует правильный вывод ['I want to be splitted using different patterns. It is', 'complex task, and not easy to solve', 'so,', 'would need help.'] . Вы должны, по крайней мере, выполнить escape . , . alone будет соответствовать любому символу, таким образом, s.s пытается соответствовать любому символу, ограниченному с обеих сторон пробелом.

Ответ №3:

Я не могу придумать ни одного регулярного выражения для этого. Итак, что вы можете сделать, это заменить все различные типы разделителей на пользовательский разделитель, скажем, $DELIMITER $, а затем разделить ваше предложение на основе этого разделителя.

 new_sent = re.sub('[.,;]', '$DELIMITER$', sent)
new_sent.split('$DELIMITER$')
  

Это приведет к следующему:

 ['I want to be splitted using different patterns',
 ' It is a complex task',
 ' and not easy to solve',
 ' so',
 ' I would need help',
 '']
  

ПРИМЕЧАНИЕ: Приведенный выше вывод содержит дополнительную пустую строку. Это потому, что в конце предложения стоит точка. Чтобы избежать этого, вы можете либо удалить этот пустой элемент из списка, либо заменить пользовательский разделитель, если он встречается в конце предложения.

 new_sent = re.sub('[.,;]', '$DELIMITER$', sent)
new_sent = re.sub('$DELIMITER$$', '', new_sent)
new_sent.split('$DELIMITER$')
  

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

 delimiter_list = [',', '.', ':', ';']
pattern = '['   ''.join(delimiter_list)   ']' #will result in [,.:;]
new_sent = re.sub(pattern, '$DELIMITER$', sent)
new_sent = re.sub('$DELIMITER$$', '', new_sent)
new_sent.split('$DELIMITER$')
  

Я надеюсь, что это поможет!!!

Ответ №4:

Используйте lookbehind с классом character:

 import re
s = "I want to be splitted using different patterns. It is a complex task, and not easy to solve; so, I would need help."
result = re.split('(?<=[.,;])s', s)
print(result)
  

Вывод:

 ['I want to be splitted using different patterns.', 
 'It is a complex task,', 
 'and not easy to solve;',
 'so,', 
 'I would need help.']