Редактировать строки регулярных выражений в Python, используя метод форматирования - PullRequest
0 голосов
/ 13 апреля 2020

Я хочу разработать регулярное выражение в Python, где компонент шаблона определяется в отдельной переменной и на лету объединяется в одну строку с помощью Python .format() строкового метода. Упрощенный пример поможет уточнить. У меня есть ряд строк, где пространство между словами может быть представлено пробелом, подчеркиванием, дефисом и т. Д. c. В качестве примера:

new referral
new-referal
new - referal
new_referral

Я могу определить строку регулярного выражения для соответствия этим возможностям как:

space_sep = '[\s\-_]+'

(дефис экранирован, чтобы гарантировать, что он не интерпретируется как определение диапазона символов .)

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

myRegexStr = "new{spc}referral".format(spc = space_sep)

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

Однако возникает проблема, если я хочу определить число вхождений других символов с помощью {m,n} или {n} структура. Например, чтобы учесть общую опечатку в написании «реферал», мне нужно разрешить 1 или 2 вхождения буквы «r». Я могу отредактировать myRegexStr следующим образом:

myRegexStr = "new{spc}refer{1,2}al".format(spc = space_sep)

Однако теперь все виды вещей ломаются из-за путаницы из-за использования фигурных скобок (либо KeyError в случае {1,2}, либо IndexError: tuple index out of range в случае {n}).

Есть ли способ использовать строковый метод .format() для построения более длинных регулярных выражений, в то же время имея возможность определять количество вхождений символов с помощью {n,m}

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете удвоить { и }, чтобы избежать их, или вы можете использовать форматирование строк старого стиля (оператор %):

my_regex = "new{spc}refer{{1,2}}al".format(spc="hello")
my_regex_old_style = "new%(spc)srefer{1,2}al" % {"spc": "hello"}

print(my_regex)           # newhellorefer{1,2}al
print(my_regex_old_style) # newhellorefer{1,2}al
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...