【发布时间】:2014-07-30 16:43:53
【问题描述】:
>>> s = 'Paris is the capital and most populous city of France'
>>> re.search('(Pa.+?)\s', s).group()
'Paris '
>>> re.findall('(Pa.+?)\s', s)
['Paris']
为什么使用这两种方法提取匹配的字符串会得到两个不同的结果?
编辑:巴黎之后的空间是我所关心的。括号不应该排除空格吗? Blender 说有 group(0) 和 group(1)。我尝试在 c- 上匹配 r"(c.+?)\s" 和 group(0) 是 'capital' 而 group(1) 是 'capital',没有 group(2)。
【问题讨论】:
-
因为
.group()是.group(0),这是整个匹配。如果您想要第一组,请使用.group(1)。 -
避免对正则表达式使用普通字符串。使用原始字符串,以避免双重转义或转义序列产生意外结果。例如:
r'(Pa.+?)\s',在您的情况下。 -
嗯,我不明白“Paris”如何匹配结尾包含非可选空格的正则表达式。
-
或者,只匹配非空格字符;即
Pa\S+。我认为它尽可能简单,并且比.+?更快(当然,在小字符串上速度差异可以忽略不计)。 -
@huggie:在 Python 中,所有无法识别的字符串文字都保持不变,所以它确实在此时此地工作。关键是您可能不知道所有转义序列,并且不应该从您现在工作的代码中推断出它将在未来工作。你正在做一个正则表达式元字符转义也更清楚,而不是让读者模棱两可它是字符串还是正则表达式转义。