繁体   English   中英

Python中的正则表达式匹配

[英]Regex match in Python

我有这样的正则表达式

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

和这样的字符串

NAME1,值1,TAG11 = value11,tag12 = value12,tag13 = value13

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

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

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

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

为什么不只用逗号分开:

s = 'name1,value1,tag11=value11,tag12=value12,tag13=value13'
print(s.split(','))

如果要使用正则表达式,使用模式就一样简单:

[^,]+

例:

https://regex101.com/r/jS6fgW/1

事实证明,Python与.NET不同,它不支持重复的命名捕获组,这有点可惜(这意味着我的解决方案比我想象的要长一点)。 这符合您的要求吗?

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是名称/值对中的相同值,我认为这是必要条件。 不确定如何执行此操作 ,这只是读者的练习。

首先,验证格式acc。 到您的模式,然后使用[,=]正则表达式(与,=匹配)进行拆分,并转换为这样的字典:

import itertools, re
s = 'name1,value1,tag11=value11,tag12=value12,tag13=value13'
if re.match(r'[^,=]+,[^,=]+(?:,[^,=]+=[^,=]+)+$', s):
    l = re.split("[=,]", s)
    d = dict(itertools.izip_longest(*[iter(l)] * 2, fillvalue=""))
    print(d)
else:
    print("Not valid!")

参见Python演示

模式

^[^,=]+,[^,=]+(?:,[^,=]+=[^,=]+)+$

详细资料

  • ^ -字符串的开头(在re.match ,由于模式已经锚定,因此可以省略)
  • [^,=]+ - 1+字符以外=,
  • , -逗号
  • [^,=]+ - 1+字符以外=,
  • (?:,[^,=]+=[^,=]+)+ -1个或多个序列:
    • , -逗号
    • [^,=]+ - 1+字符以外=,
    • = -等号
    • [^,=]+ - 1+字符以外=,
  • $ -字符串结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM