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

时间:2016-08-25 19:48:24

标签: 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 Pig!

我错过了什么?

3 个答案:

答案 0 :(得分:8)

由于.+的贪婪性,你得到了尾随空格。

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

>>> re.search(r"\s*(Name)\s*=\s*(.+?)\s*$", line).groups()
('Name', 'Peppa Pig')

\s*$确保我们在最后跟踪空格之前捕获值。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

your regex demo(在步骤15特别注意):

enter image description here

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

import re
line = "  Name =  Peppa Pig  "
match = [(x,y.strip()) for x,y in re.findall(r"(Name)\s*=(.+)", line)]
print(match)

请参阅Python demo