Python正则表达式重新定义器2个匹配项

时间:2019-12-01 14:20:25

标签: python regex python-3.x python-2.7

我希望使用单个函数来匹配可在另一个函数中使用的多个值。

我可以从下面开始使用单个正则表达式值,寻找与第二个正则表达式“ regex2”匹配的建议

工作---

def parse_desc(description):
    regex = r"^Created on\((.*?)\) for (.*?) "
    matches = re.finditer(regex, description, re.MULTILINE)
    for matchNum, match in enumerate(matches):
        return match.groups()
    return '', ''

建议--试图找到“创建于”和“复制于”的匹配项

def pass_desc(description):
    regex = r"^Created on\((.*?)\) for (.*?) "
    regex2 = r"^(.*?)Copied on (.*?) "
    matches = re.finditer(regex, description, re.MULTILINE) or re.finditer(regex2, description, re.MULTILINE)
    for matchNum, match in enumerate(matches):
        return match.groups()
    return '', ''

我可以让两个正则表达式都可以作为单个函数工作

3 个答案:

答案 0 :(得分:1)

要了解为什么这种方法行不通,请尝试在解释器1 or 2中执行。 here对此行为进行了解释。

我将分别搜索这两种模式,然后在随后的两个for循环中对其进行遍历。如果您只需要一个迭代器对象,则应该可以使用

from itertools import chain
y_iter = chain(l1, l2)

将两个迭代器对象链接在一起。

答案 1 :(得分:0)

|(或)组合两个正则表达式。现在,每个匹配项将返回4个组,其中两个将根据匹配的内容为None。即使您有一个for循环,您还是在检索第一个匹配项后发出了return,但这是不正确的。更新的代码使用 list理解返回 all 匹配项:

重新导入

def pass_desc(description):
    regex12 = r"^Created on\((.*?)\) for (.*?) |^(.*?)Copied on (.*?) "
    return [match.groups() for match in re.finditer(regex12, description, re.MULTILINE)]

print(pass_desc('Created on(Tuesday) for Mary \nIt was Copied on Friday for Sally.'))

打印:

[('Tuesday', 'Mary', None, None), (None, None, 'It was ', 'Friday')]

答案 2 :(得分:0)

def pass_desc(description):
    regex = r"^Created on\((.*?)\) for (.*?) "
    regex2 = r"^(.*?)Copied on (.*?) "
    matches = re.finditer(regex, description, re.MULTILINE)
    matches2 = re.finditer(regex2, description, re.MULTILINE)

    from itertools import chain
    y_iter = chain(matches, matches2)

    for matchNum, match in enumerate(y_iter):
        return match.groups()
    return '', ''