regex: сопоставить группу, но вернуть другую строку - PullRequest
1 голос
/ 15 апреля 2020

Рассмотрим следующие строки

C 1
D 2.2
Y 1
Z 2.2

Мне нужно регулярное выражение, чтобы сопоставить оба и вернуть 1 или 2 соответственно. Работает следующее регулярное выражение:

((C|Y) (\d)|(D|Z) (\d).(?:\d))

Что важнее: мне также нужно знать, было ли найдено соответствие (C | Y) или (D | Z).

Я планирую сделать это в коде вызова (который python). Я мог бы проверить, является ли строка C, Y, D или Z, но этот подход не является расширяемым. Я хочу, чтобы регулярное выражение возвращало A в первой группе захвата, если либо C, либо Y были сопоставлены, и B, если либо D, либо Z были сопоставлены. Таким образом, мне нужно только проверить A или B в вызывающем коде, и я могу легко расширить классы за счет большего числа членов. Есть ли способ сделать это?

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

1 Ответ

2 голосов
/ 16 апреля 2020

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

import re

text = '''C 1
D 2.2
Y 1
Z 2.2'''

for s in text.splitlines():
  print("--- '" + s + "' ---")
  m = re.search(r'((C|Y) (\d)|(D|Z) (\d)\.(?:\d))', s)
  if m and m.group(2):
    print(m.group(3))
  elif m and m.group(4):
    print(m.group(5))
  else:
    print("NO MATCH!")

См. Python demo , вывод:

--- 'C 1' ---
1
--- 'D 2.2' ---
2
--- 'Y 1' ---
1
--- 'Z 2.2' ---
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...