Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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正则表达式不会忽略行末尾的空白_Python_Regex - Fatal编程技术网

python正则表达式不会忽略行末尾的空白

python正则表达式不会忽略行末尾的空白,python,regex,Python,Regex,前导空格将被忽略,但尾随空格不在下面的正则表达式代码中。它只是一个“Name=Value”字符串,但带有空格。我以为捕获后的\s*会忽略空格 import re line = " Name = Peppa Pig " match = re.search(r"\s*(Name)\s*=\s*(.+)\s*", line) print(match.groups()) >>>('Name', 'Peppa Pig ') # Why extra spaces after P

前导空格将被忽略,但尾随空格不在下面的正则表达式代码中。它只是一个
“Name=Value”
字符串,但带有空格。我以为捕获后的
\s*
会忽略空格

import re
line = "  Name =  Peppa Pig  "
match = re.search(r"\s*(Name)\s*=\s*(.+)\s*", line)
print(match.groups())
>>>('Name', 'Peppa Pig   ')  # Why extra spaces after Pig!

我遗漏了什么?

由于
+
的贪婪性质,您得到了尾随空格

您可以使用此正则表达式正确捕获您的值:

>>> re.search(r"\s*(Name)\s*=\s*(.+?)\s*$", line).groups()
('Name', 'Peppa Pig')
\s*$
确保我们在尾随空格之前捕获值。

而不是使用
(.+)\s*
(其中
\s*
是无用的,因为在贪婪的量词
+
之后,“零个或多个空格”不是一个约束,就像什么也不写一样),您可以使用
(.*\s)
将自动修剪最后一个非空白字符后的字符串
\S

match = re.search(r"\b(Name)\s*=\s*(.*\S)", line)

问题:是否真的需要捕获已知的“Name”文本字符串?

最后一个
+
捕获该行的整个剩余部分(因为
匹配除换行符以外的任何字符),然后开始回溯,检查后续子模式是否匹配。由于后续子模式是可以匹配空字符串的
\s*
(它匹配0+空格),因此此模式在字符串末尾成功匹配,并返回与尾部空格的有效匹配

请参阅(在步骤15中特别注意):

您可以让Python在列表中执行
strip
工作,并将正则表达式简化为
(Name)\s*=(.+)


请参见

无论问题是什么,您都可以使用
match=match.strip()
删除前导空格和尾随空格。请参见我的说明,以及一个。@OhadEytan-是的,我当然可以用python进行strip,但我想了解正则表达式的方式,因为行中可能有多个“name=value”对。i、 e.线上可能会有更多的捕获,这就是为什么我以“不管问题”作为开场白,作为一个局外人,在某个时候可能会有这样的问题。。添加的
(.+?)
+?
中做了什么,使得它与贪婪的
+
相比是一个懒惰的匹配,但是懒惰的量词在性能上会输给贪婪的量词(参见Casimir的答案),因为结尾有很多空格。另外,让正则表达式做它的艰苦工作,让Python做修剪工作。从两个世界中取其精华:)@anubhava-不错,但我更喜欢Casimir的答案
import re
line = "  Name =  Peppa Pig  "
match = [(x,y.strip()) for x,y in re.findall(r"(Name)\s*=(.+)", line)]
print(match)