前导空格被忽略,但尾随空格不在下面的正则表达式代码中。它只是一个"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!
我错过了什么?
答案 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特别注意):
您可以让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