Невозможно разделить с помощью регулярного выражения

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

шаблон = . (¨любой текст¨).

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, который вы ожидаете.

Tim Biegeleisen 09.04.2022 08:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
32
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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? Тот, что перед метасимволами.

Omar Acuache 09.04.2022 10:43

Вы имеете в виду строку, начинающуюся с r, как в r""? Это способ сообщить python, что это строка рaw, игнорируя любой escape-символ. Это просто упрощает написание регулярных выражений.

BlackBeans 09.04.2022 16:24

Другие вопросы по теме