Python Regex, если в строке есть скобка - PullRequest
1 голос
/ 28 мая 2020
the co[njuring](media_title)

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

В настоящее время у меня есть регулярное выражение, которое превращает

line = Can I please eat at[  warunk upnormal](restaurant_name)

line = re.sub('\[\s*(.*?)\s*\]', r'[\1]', line)
line = re.sub(r'(\w)\[', r'\1 [', line)

Can I please eat at [warunk upnormal](restaurant_name)

Обратите внимание, что нет никаких пробелов, что хорошо, и оно создает пробел char и скобку ex. x [to x [

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

the co[njuring](media_title)
the co[njuring](media_title) and che[ese dog]s(food)

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

line = re.sub('\[\s*(.*?)\s*\]', r'[\1]', line)
line = re.sub(r'(\w)\[', r'\1 [', line)

1 Ответ

0 голосов
/ 30 мая 2020

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

(\w)\[\s*(.*?)\s*\]

Regex demo и Python demo

В качестве замены используйте 2 группы захвата \1 [\2]

Пример кода

line = re.sub('(\w)\[\s*(.*?)\s*\]', r'\1 [\2]', line)

Разные в данном формат, который я вижу, заключается в том, что присутствует подчеркивание (вместо скобки) между круглыми скобками (restaurant_name) и (media_title) vs (food)

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

(\w)\[\s*(.*?)\s*\](\([^_\s()]+(?:_[^_\s()]+)+\))

Пояснение

  • (\w) Захват группа 1 , сопоставить слово char
  • \[\s* Сопоставить [ и 0+ пробелов
  • (.*?) Захват группа 2 , сопоставить любой символ, кроме символа новой строки, не жадный
  • \s*\] Сопоставить 0+ пробельных символов и ]
  • ( захват группа 3
    • \( Соответствует (
    • [^_\s()]+ Соответствует 1+ раз любому символу, кроме символа подчеркивания, пробела или круглой скобки
    • (?:_[^_\s()]+)+ Повторить 1 + умножение на предыдущий образец с добавлением подчеркивания
    • \) Соответствие )
  • ) Закрыть группу

В Для замены используйте 3 группы захвата \1 [\2]\3

Regex demo и Python demo

Пример кода

import re

regex = r"(\w)\[\s*(.*?)\s*\](\([^_\s()]+(?:_[^_\s()]+)+\))"

test_str = ("Can I please eat at[  warunk upnormal](restaurant_name)\n"
    "Can I please eat at[  warunk upnormal   ](restaurant_name)\n"
    "the co[njuring](media_title)\n"
    "the co[njuring](media_title) and che[ese dog]s(food)")

result = re.sub(regex, r"\1 [\2]\3", test_str)

if result:
    print (result)

Выход

Can I please eat at [warunk upnormal](restaurant_name)
Can I please eat at [warunk upnormal](restaurant_name)
the co [njuring](media_title)
the co [njuring](media_title) and che[ese dog]s(food)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...