Регулярное выражение для многосимвольных строк, встроенных в оставшуюся часть соответствия?

#python #regex #pattern-matching

#python #регулярное выражение #сопоставление с шаблоном

Вопрос:

Как я могу сопоставить что-то вроде, за "AB|CD|EF" чем следует "12|34" , и получить, например, "AB12" обратно? Если бы строка была, "zzAB34zz" я бы получал "AB34" , "zzABCD12" и получал "CD12" и т.д.?

Ответ №1:

На самом деле здесь нет необходимости в именованных группах:

 import re
re.search('(AB|CD|EF)(12|34)', 'zzAB34zz').group()
  

Ответ №2:

Используйте круглые скобки для захвата:

 import re
r = re.compile(r'(?P<stuff>(AB|CD|EF)(12|34))')

r.findall('__ABCD12__EF34__')
#[('CD12', 'CD', '12'), ('EF34', 'EF', '34')]

r.search('__ABCD12__EF34__').group('stuff')
#'CD12'
  

Именованные круглые скобки (?P<name>...) могут помочь избежать раздражающей индексации.

Ответ №3:

 import re ; "".join(re.compile("(AB|CD|EF)(12|34)").search("zAB12z").groups())
  

выводит:

 'AB12'