使用Python正则表达式来检查密钥:value; key:value;字符串格式正确

时间:2014-02-18 01:15:21

标签: python regex

我的Python程序处理由id:value组成的字符串;对如:

s = "1:name;2:another name;3:one last name;"

id应该始终是数字和最终的;是可选的。 我想实现一个正则表达式,它既检查字符串是否格式正确,并为我做分裂。

我写了这个:

>>> import re
>>> r = re.compile(r'([0-9]+):([^:;]+)(?:;|$)*')

这似乎正确分裂:

>>> dict(r.findall(s))
{'1': 'name', '3': 'one last name', '2': 'another name'}

问题是我也喜欢使用我的正则表达式来捕获格式错误的字符串。有没有办法改变它以便以下操作失败?

>>> r.match("1:name;dummy:another name;3:one last name;")
>>> r.match("1:name;a2:another name;3:one last name;")

谢谢! 弗兰克

2 个答案:

答案 0 :(得分:0)

您可以使用不同的正则表达式执行匹配,其中包括$ end of string,这将为您验证字符串。

>>> validate = re.compile(r'(([0-9]+):([^:;]+)(?:;|$)*)*$')
>>> validate.match("1:name;2:another name;3:one last name;")
<_sre.SRE_Match object at 0x02B132A0>
>>> validate.match("1:name;dummy:another name;3:one last name;") # is None
>>> validate.match("1:name;a2:another name;3:one last name;") # is also None

我无法想到使用匹配和findall与相同的正则表达式进行验证的方法。但是,我认为这样做也不是一个好主意。

以下解释了为什么您不能使用相同的正则表达式进行分组和验证

您必须使用findall()来获取未知数量的组,使用MatchObject将无法正常工作,因为它不会处理可变数量的组。

因此,假设您正在使用R函数使用此正则表达式findall()R必须匹配具有可变数量表达式的字符串中的单个表达式。但是对于R调用,没有办法以类似的方式使用match(),因为R只匹配字符串中变量数的一个表达式,所以无法保证字符串其余部分的内容。

答案 1 :(得分:0)

坦率地说,我不会在这里使用正则表达式。我会用dict理解。

s = "1:name;2:another name;3:one last name;"
id_values = {k:v for entries in s.split(";") if entries for
            k,v in [entries.split(":")] if k.isdigit()}
print(id_values)
# {'1': 'name', '3': 'one last name', '2': 'another name'}

s2 = "1:name;dummy:another name;3:one last name;"
id_values_2 = {k:v for entries in s2.split(";") if entries for
              k,v in [entries.split(":")] if k.isdigit()}
print(id_values_2)
# {'1': 'name', '3': 'one last name'}