将RegEx映射到附加"指令"使用dictonary

时间:2017-06-26 11:25:45

标签: python regex dictionary

我查看了一些旧的Java代码,其中我从许多字符串中提取日期和格式。如果条件和正则表达式模式和匹配器,这是一个可怕的混乱。 所以我想到了如何在Python中解决这个问题。我有一些映射到日期格式的正则表达式模式,从中创建时间戳。我听说"如果在Java中有一个switch语句,那么在Python中应该有一个dictonary":

pattern_dic = {
    "[\\d]{2}:[\\d]{2}, .{3} [\\d]{1,2}, [\\d]{4} \\(UTC\\)": "HH:mm, MMM dd, yyyy (zzz)",
    "[\d]{2}:[\d]{2}, [\d]{1,2} .{3} [\d]{4} \(UTC\)"       : "HH:mm, dd MMM yyyy (zzz)",
    ...
}

*我认为我必须更改这些日期模式,因为我只是从Java解决方案中复制它们。

在另一个我有正则表达式/替换对的问题中,我找到了一个非常好的解决方案,使用这样的字典 (Stack Overflow上一些出色的人提供)。这只适用于匹配的正则表达式是一个简单的字符串,所以它可以在字典中查找(我认为)。

pattern_acc = re.compile(r'\b(' + '|'.join(pattern_dic.keys()) + r')\b')
comment = pattern_acc.sub(lambda x: pattern_dic[x.group()], comment)

这是我到目前为止所提出的。我的问题是,我不知道如何在字典中查找正则表达式的匹配部分(" matching_date_pattern"):

def multi_match(input_string, pattern_dic):
    date_pattern = re.compile(r'\b(' + '|'.join(pattern_dic.keys()) + r')\b')
    matches = date_pattern.findall(input_string)

    date_formats = []
    for match in matches:
        matching_string = match.group()
        date_format = pattern_dic["matching_date_pattern"]
        date_formats.append((matching_string, date_format))

修改 我应该说我想解决这个问题作为初步问题。我想分开匹配和搜索。虽然能够访问匹配模式。 例如,如果正则表达式包含许多组和"指令"它们匹配变得更加复杂。想象一下,例如,您期望很多不同的文本对象,如链接,降价元素等。我现在的问题归结为知道匹配和搜索之间匹配的模式。

也许问题是编译模式的成本也是多少,因为当然单独编译它们会使访问它们变得更容易。

1 个答案:

答案 0 :(得分:0)

您从Stack Overflow中抢夺的代码很好,您希望匹配多个正则表达式的任何,但无法解决您找到哪个的问题regexps在每种特定情况下都匹配。您应该只是迭代pattern_dic并依次检查每个键:

def multi_match(input_string, pattern_dic):
    for regexp in pattern_dic:
        re.search(regexp, input_string)
        matching_string = match.group()
        date_format = pattern_dic[regexp]
        date_formats.append((matching_string, date_format))
    return date_formats

旁注:.append接受一个参数,因此有必要形成一个元组 - 因此需要另外一对括号。