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)