Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python正则表达式检查key:value;关键词:价值;这根绳子的形状很好_Python_Regex - Fatal编程技术网

使用Python正则表达式检查key:value;关键词:价值;这根绳子的形状很好

使用Python正则表达式检查key:value;关键词:价值;这根绳子的形状很好,python,regex,Python,Regex,我的Python程序处理由id:value组成的字符串;对,例如: s = "1:name;2:another name;3:one last name;" id应始终是数字和最终的;是可选的。 我想实现一个正则表达式,它既可以检查字符串的格式是否正确,也可以为我进行拆分 我写道: >>> import re >>> r = re.compile(r'([0-9]+):([^:;]+)(?:;|$)*') 这似乎可以正确地进行拆分: >>>

我的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;")
谢谢!
Frank

您可以使用不同的正则表达式执行匹配,该正则表达式包含$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
>>validate=re.compile(r'([0-9]+):([^:;]+)(?:;|$)*)*$)
>>>validate.match(“1:名称;2:另一个名称;3:一个姓氏;”)
>>>validate.match(“1:name;dummy:other name;3:one last name;”)为无
>>>validate.match(“1:name;a2:other name;3:one last name;”)也是无
我想不出用match和findall对同一个正则表达式进行验证的方法。但是,我认为这样做也不是一个好主意

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

您必须使用
findall()
获取未知数量的组,使用MatchObject根本不起作用,因为它不会处理数量可变的组


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

坦白地说,我在这里不使用regex。我会使用听写理解

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'}

你混淆了
^
$
匹配
不需要
^
:)啊,你是对的,匹配不需要^,但是你说我混淆了^和$是什么意思?
^
是字符串的开始,
$
是字符串的结束:)