使用模糊正则表达式提取命名组和非命名组

问题描述 投票:0回答:1

我正在寻找一种将正则表达式应用于文本并以字典的形式提取其值的方法。
正则表达式中的组可以是命名的、未命名的或混合的。
理想情况下,我会使用模糊匹配(允许文本中出现一些错误)。

文字示例:

Name: foo BaR; Age: 42

正则表达式示例:
Name: (?<name>[a-z]+) (?<lastname>[A-Z]+); Age: (\d+)'

预期输出:
{name: foo, lastname: BaR, gr0: 42}

带着问题,我也在下面贴出我的答案
如果有更好的方法,我很乐意采用;)

干杯:)

python regex fuzzy-search
1个回答
0
投票

这就是我到目前为止使用的。

  • 第一个:修改正则表达式,使每个组都是命名组
  • 第二:向正则表达式添加错误可能性(使用
    {e<=3}
  • 第三:使用
    regex.search(...).capturedict()
    提取命名组的字典

text="Name: foo BaR; Age: 42"
pattern = r'Name: (?<name>[a-z]+) (?<lastname>[A-Z]+); Age: (\d+)'

def name_groups_in_regex(pattern):
    '''Make sure that all the groups in the regex are named-groups
    Replace a non-named-group by "gr<idx>"
    '''
    # Pattern to get non-named group
    get_parenthesis_pattern = r"(?<!\\)\((?!\?)"

    # Count matches
    n_parenthesis = len(re.findall(get_parenthesis_pattern, pattern))
    
    # substitute non-named group with named group
    pattern = re.sub(get_parenthesis_pattern, "(?<gr%d>", pattern)
    pattern = pattern % tuple(i for i in range(n_parenthesis))

    return pattern

# Name the groups in the regex
pattern = name_groups_in_regex(pattern)

# Perform fuzzy matching with an overall maximum of 3 'errors'
fuzzy_pattern = f'({pattern}){{e<=3}}'
regex.search(fuzzy_pattern, text, regex.BESTMATCH).capturesdict()

输出

{'name': ['foo'], 'lastname': ['BaR'], 'gr0': ['42']}

© www.soinside.com 2019 - 2024. All rights reserved.