Проблема с внедрением Regex в Python - PullRequest
1 голос
/ 29 апреля 2020

У меня проблемы с реализацией шаблона регулярного выражения в python. Мое выражение работает в https://regexr.com/, но я не могу заставить его работать в python.

Вот мое выражение: [abcd][(]\d+[)]|(ab)[(]\d+[)]|(abcd)[(]\d+[)] Я хочу найти и вернуть экземпляры a(\d+), b(\d+), c(\d+), d(\d+), ab(\d+) или abcd(\d+)

expressions = re.findall(r"[abcd][(]\d+[)]|(ab)[(]\d+[)]|(abcd)[(]\d+[)]",line)
print(expressions)

Я думаю, что это может работать, потому что когда в строке есть что-то, что должно соответствовать шаблон Я получаю [('', '')] в качестве вывода вместо []

Есть мысли?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2020

Я думаю, вы неправильно использовали [(] или [)]. И \(\d+\) часть избыточна. Таким образом, вы можете оптимизировать его:

import re

line = 'a(123) b(11) ab(35) bc(45) abcd(1234)'

expressions = re.findall(
    r'(?:[abcd]|ab|abcd)\(\d+\)',
    line)
print(expressions)

вывод:

['a(123)', 'b(11)', 'ab(35)', 'c(45)', 'abcd(1234)']

объяснение:

  • (?:...) - группа без захвата. Это только для группировки без захвата.
  • \( и \): \ является escape-символом для специальных символов, таких как ( или ). \( соответствует буквальному (.
2 голосов
/ 29 апреля 2020
expressions = re.findall(r"[abcd](\d+)|(ab)(\d+)|(abcd)(\d+)",line)
print(expressions)

Это должно работать. проблема была в: Python, вы не ставите ( в скобках. Если вы подразумеваете круглые скобки буквально в (d+), вы должны использовать экранированный парантез \( и \).

Имейте в виду, что если вы поставите скобки вокруг ab или abcd, они будут перечислены при ссылке на группировки. Я бы не ставил паратезы, если в этом нет необходимости.

expressions = re.findall(r"[abcd]\(\d+\)|ab\(\d+\)|abcd\(\d+\)",line)
print(expressions)

Если вы хотите просто сопоставить a1236, ab12, abcd12342, тогда используйте

expressions = re.findall(r"[abcd]\d+|ab\d+|abcd\d+",line)
print(expressions)

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

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