Skip to main content
 首页 » 编程设计

python之Python 中的正则表达式匹配

2024年08月21日34zhengyun_ustc

我有一个这样的正则表达式

r"^(.*?),(.*?)(,.*?=.*)" 

像这样的字符串

name1,value1,tag11=value11,tag12=value12,tag13=value13

我正在尝试使用正则表达式检查字符串是否遵循以下格式:name,value,名称和值对以逗号分隔。

然后我需要使用正则表达式提取逗号分隔的数据。

我将提取的数据作为第一组作为 name1,第二组作为 value2,第三组从 tag11 到 value13 完全匹配(由于贪婪匹配)。

但我想匹配每个名称和值对。我是 Python 的新手,不确定如何实现。

请您参考如下方法:

事实证明,与 .NET 不同,Python 不支持重复命名的捕获组,这有点遗憾(意味着我的解决方案比我认为需要的要长一点)。这是否符合您的要求?

import re 
 
def is_valid(s): 
    pattern = '^name\d+,value\d+(,tag\d+=value\d+)*$' 
    return re.match(pattern, s) 
 
def get_name_value_pairs(s): 
    if not is_valid(s): 
        raise ValueError('Invalid input: {}'.format(s)) 
 
    pattern = '((?P<name1>\w+),(?P<value1>\w+))|(?P<name2>\w+)=(?P<value2>\w+)' 
    for match in re.finditer(pattern, s): 
        name1 = match.group('name1') 
        name2 = match.group('name2') 
        value1 = match.group('value1') 
        value2 = match.group('value2') 
 
        if name1 and value1: 
            yield name1, value1 
        elif name2 and value2: 
            yield name2, value2 
 
if __name__ == '__main__': 
    testString = 'name1,value1,tag11=value11,tag12=value12,tag13=value13' 
    assert not is_valid('') 
    assert not is_valid('foo') 
    assert is_valid(testString) 
 
    print(list(get_name_value_pairs(testString))) 

输出

[('name1', 'value1'), ('tag11', 'value11'), ('tag12', 'value12'), ('tag13', 'value13')] 

编辑 1

添加了输入验证逻辑。做出的假设:

  • 必须有 name<x>,value<x> 形式的初始名称/值对
  • 所有以下对必须采用 tag<x>=value<x> 形式
  • 名称和值仅由字母数字字符组成
  • 不允许有空格

请注意,我目前并未验证 x 是否为名称/值对中的相同值,我认为这是一项要求。我不确定该怎么做,留给读者作为练习。