1

这只是为了学习目的,我有以下代码。如果我想在'abcbc'没有双引号的情况下提取怎么办?我也试着re.search(r'\A\"(.*?)\"',a).group()注意到变化。

>>> a = "\"abcbc\" lol"
>>> re.search(r'\A"(.*?)"',a).group()
'"abcbc"'

另外,如果我将模式更改'\A"(.*?)'为此应该只返回双引号后的所有内容?但它给出了以下内容。有什么我错了吗?

>>> re.search(r'\A"(.*?)',a).group()
'"'
4

1 回答 1

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'
于 2013-05-12T23:20:33.150 回答