3

以下のようなコードを書くと、深いインデントが発生します

match = re.search(some_regex_1, s)
if match:
    # do something with match data
else:
    match = re.search(some_regex_2, s)
    if match:
        # do something with match data
    else:
        match = re.search(soem_regex_3, s)
        if match:
            # do something with match data
        else:
            # ...
            # and so on

私は次のように書き直そうとしました:

if match = re.search(some_regex_1, s):
    # ...
elif match = re.search(some_regex_2, s):
    # ...
elif ....
    # ...
...

しかし、Pythonはその構文を許可していません。この場合、深いインデントを回避するにはどうすればよいですか?

4

3 に答える 3

6
regexes = (regex1, regex2, regex3)
for regex in regexes:
    match = re.search(regex, s)
    if match:
        #do stuff
        break

または(より高度な):

def process1(match_obj):
    #handle match 1

def process2(match_obj):
    #handle match 2

def process3(match_obj):
    #handle match 3
.
.
.
handler_map = ((regex1, process1), (regex2, process2), (regex3, process3))
for regex, handler in handler_map:
    match = re.search(regex, s)
    if match:
        result = handler(match)
        break
else:
    #else condition if no regex matches
于 2012-05-21T18:38:06.740 に答える
2

finditer()(ほとんどの場合)代わりに使用できる場合はsearch()、すべての正規表現を1つに結合して、シンボリックグループ名を使用できます。次に例を示します。

import re

regex = """
   (?P<number> \d+ ) |
   (?P<word> \w+ ) |
   (?P<punctuation> \. | \! | \? | \, | \; | \: ) |
   (?P<whitespace> \s+ ) |
   (?P<eof> $ ) |
   (?P<error> \S )
"""

scan = re.compile(pattern=regex, flags=re.VERBOSE).finditer

for match in scan('Hi, my name is Joe. I am 1 programmer.'):
    token_type = match.lastgroup
    if token_type == 'number':
        print 'found number "%s"' % match.group()
    elif token_type == 'word':
        print 'found word "%s"' % match.group()
    elif token_type == 'punctuation':
        print 'found punctuation character "%s"' % match.group()
    elif token_type == 'whitespace':
        print 'found whitespace'
    elif token_type == 'eof':
        print 'done parsing'
        break
    else:
        raise ValueError('String kaputt!')
于 2012-05-21T19:15:50.220 に答える
0
if re.search(some_regex_1, s) is not None:
    # ...
elif re.search(some_regex_2, s) is not None:
    # ...
elif ....
    # ...
...

search()は、一致するものが見つからない場合はNoneを返すため、ifステートメントで次のテストに進みます。

于 2012-05-21T18:40:38.867 に答える