Соответствие регулярному выражению Python в условных выражениях - PullRequest
23 голосов
/ 04 мая 2011

Я анализирую файл и хочу проверить каждую строку на наличие нескольких сложных регулярных выражений. Как то так

if re.match(regex1, line): do stuff
elif re.match(regex2, line): do other stuff
elif re.match(regex3, line): do still more stuff
...

Конечно, чтобы делать вещи, мне нужны объекты соответствия. Я могу думать только о трех возможностях, каждая из которых оставляет желать лучшего.

if re.match(regex1, line): 
    m = re.match(regex1, line)
    do stuff
elif re.match(regex2, line):
    m = re.match(regex2, line)
    do other stuff
...

, который требует двойного сложного сопоставления (это длинные файлы и длинное регулярное выражение: /)

m = re.match(regex1, line)
if m: do stuff
else:
    m = re.match(regex2, line)
    if m: do other stuff
    else:
       ...

, который становится ужасным, когда я отступаю все дальше и дальше.

while True:
    m = re.match(regex1, line)
    if m:
        do stuff
        break
    m = re.match(regex2, line)
    if m:
        do other stuff
        break
    ...

, что выглядит странно.

Какой правильный способ сделать это?

Ответы [ 12 ]

0 голосов
/ 04 мая 2011

Почему бы не использовать словарь / оператор switch?

def action1(stuff):
    do the stuff 1
def action2(stuff):
    do the stuff 2

regex_action_dict = {regex1 : action1, regex2 : action2}
for regex, action in regex_action_dict.iteritems():
    match_object = re.match(regex, line):
    if match_object:
        action(match_object, line)
0 голосов
/ 04 мая 2011

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

что-то вроде:

if re.match(simplepart,line):
      if re.match(complexregex, line):
          do stuff
elif re.match(othersimple, line):
      if re.match(complexother, line):
          do other stuff
...