Есть ли способ ИЛИ несколько выходов re.compile ()? - PullRequest
0 голосов
/ 03 ноября 2019

Предположим, что у меня уже есть некоторые объекты, созданные с помощью re.compile().

x = re.compile('abc')
y = re.compile('abd')

Есть ли способ OR x и y в новый объект?

z = re.compile('abc|abd')

Обратите внимание, чтоЯ использовал оригинальные регулярные выражения "abc" и "abd". Но в реальных ситуациях я могу их не знать, я знаю только x и y.

Я хотел бы объединить оригинальные регулярные выражения в новый объект регулярных выражений. Я не хочу использовать что-то вроде any() для проверки каждого регулярного выражения, так как объединенное регулярное выражение должно работать быстрее.

1 Ответ

0 голосов
/ 03 ноября 2019

Простейшим было бы объединить их по строкам с соответствующим синтаксисом регулярных выражений:

x = re.compile('abc')
y = re.compile('abd')
z = re.compile('(?:%s)|(?:%s)' % (x.pattern, y.pattern))

Вы также можете сделать то же самое в списке:

regexes = [
    re.compile('abc'),
    re.compile('abd')
]
z = re.compile('|'.join('(?:%s)' % i.pattern for i in regexes))

Примечание: это не будет учитывать параметры для re.compile, такие как re.I или re.M. Вы также можете включить их и выдать ошибку, если параметры не совпадают.

def join_regexes(regexes):
    patterns = []
    for i, regex in enumerate(regexes):
        if not i:
            flags = regex.flags
        elif flags != regex.flags:
            raise Exception('regex flags need to match')
        patterns.append(regex.pattern)
    pattern = '|'.join('(?:%s)' % p for p in patterns)
    return re.compile(pattern, flags)
...