Я пытался разделить текст с помощью регулярных выражений, но не смог заставить его работать должным образом. Я хочу разделить, только если он найдет шаблон.
шаблон = . (¨любой текст¨).
txt = "primer dia. (pag. 4 - pag. 5) otro dia mas. (pag. 4 - pag. 5) tercer parte. (pag. 9)"
x = re.split("\.\s\(.+\)", txt)
print(x)
Ожидаемый результат = ['primer dia', 'otro dia mas', 'tercer parte.']
Но код не работает, потому что он возвращает только первый раздел, я что-то упустил?
Спасибо.
Один из подходов состоит в том, чтобы использовать чередование регулярных выражений, чтобы сначала сопоставить термины в круглых скобках, что вам не нужно, возвращаясь к сопоставлению предложений, которые вы хотите.
txt = "primer dia. (pag. 4 - pag. 5) otro dia mas. (pag. 4 - pag. 5) tercer parte. (pag. 9)"
matches = [x for x in re.findall(r'\(.*?\)|(\w+(?: \w+)*\.)', txt) if x]
print(matches) # ['primer dia.', 'otro dia mas.', 'tercer parte.']
Обратите внимание, что мы помещаем только нужный контент в группу захвата. Это означает, что (...)
будет отображать вывод из re.findall
как пустую строку, которую мы удаляем, используя простое понимание списка.
Другой подход состоял бы в том, чтобы фактически исправить ваше регулярное выражение. Проблема в том, что регулярное выражение является жадным, поэтому совпадение в скобках фактически соответствует от первой скобки до последней. Два решения этого.
txt = "primer dia. (pag. 4 - pag. 5) otro dia mas. (pag. 4 - pag. 5) tercer parte. (pag. 9)"
x = re.split(r"\.\s\(.+?\)", txt)[:-1]
print(x)
Два отличия от вашего кода. Первое, самое важное, это то, что я добавил ?
после +
, что сделало его нежадным. Во-вторых, я пропускаю последнее совпадение, потому что в конце предложения у вас есть пустая строка, которая вам, вероятно, не нужна.
txt = "primer dia. (pag. 4 - pag. 5) otro dia mas. (pag. 4 - pag. 5) tercer parte. (pag. 9)"
x = re.split(r"\.\s\([^)]+\)", txt)[:-1]
print(x)
Как и раньше, я отбросил последнее совпадение, потому что это пустая строка. Однако на этот раз я заменил .
на [^)]
, что означает «соответствовать любому символу, который не является закрывающей скобкой».
Большое спасибо, это было действительно полезно. Только один маленький вопрос, что здесь означает r? Тот, что перед метасимволами.
Вы имеете в виду строку, начинающуюся с r, как в r""
? Это способ сообщить python, что это строка рaw, игнорируя любой escape-символ. Это просто упрощает написание регулярных выражений.
Пожалуйста, включите здесь разделенный вывод из
txt
, который вы ожидаете.