#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.']