这仅用于学习目的,我有以下代码。如果我想用双引号提取'abcbc'
怎么办?我也尝试re.search(r'\A\"(.*?)\"',a).group()
注意到改变。
>>> a = "\"abcbc\" lol"
>>> re.search(r'\A"(.*?)"',a).group()
'"abcbc"'
如果我将模式更改为'\A"(.*?)'
,这应该只是在双引号后返回所有内容?但它给出了以下内容。有什么我错的吗?
>>> re.search(r'\A"(.*?)',a).group()
'"'
答案 0 :(得分:3)
您正在捕获组中的内容,但是通过不带参数调用group()
,您将返回整个匹配(组0),而不是您想要的组(即组1)。致电.group(1)
以返回第一组,其中包含您想要的内容。
>>> a = "\"abcbc\" lol"
>>> re.search(r'\A"(.*?)"',a).group(1)
'abcbc'
至于你的第二个问题,*?
是非贪婪的:它会尽可能少地匹配。由于*
允许匹配零,*?
将匹配任何内容,如果它可以 - 并且它可以,因为你之后没有任何东西强制它匹配到某一点。使用它之后的引用,它将匹配尽可能少的匹配下一个引号,这迫使它继续消耗文本,直到它达到关闭引用。但没有引用,它只是没有匹配,因为它没有理由继续匹配。
如果你使用非贪婪的,它会在双引号之后确实匹配所有内容--- 所有,直到最后一行:
>>> re.search(r'\A"(.*)',a).group()
'"abcbc" lol'