我的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;")
谢谢! 弗兰克
答案 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'}