python正则表达式中括号的奇怪行为

python正则表达式中括号的奇怪行为,python,regex,quotes,parentheses,backreference,Python,Regex,Quotes,Parentheses,Backreference,我正在编写一个python正则表达式,它在文本文档中查找带引号的字符串(从黑盒中记录的飞行员的引号)。我开始尝试使用以下规则编写正则表达式: 返回引号之间的内容。 如果以单键打开,则仅当以单键关闭时返回。 如果以double打开,则仅当以double关闭时返回 例如,我不想匹配“hi there”或“hi there”,而是要匹配“hi there”和“hi there” 我使用的测试页面包含以下内容: CA "Runway 18, wind 230 degrees, five knots,

我正在编写一个python正则表达式,它在文本文档中查找带引号的字符串(从黑盒中记录的飞行员的引号)。我开始尝试使用以下规则编写正则表达式:

返回引号之间的内容。
如果以单键打开,则仅当以单键关闭时返回。
如果以double打开,则仅当以double关闭时返回

例如,我不想匹配“hi there”或“hi there”,而是要匹配“hi there”和“hi there”

我使用的测试页面包含以下内容:

CA  "Runway 18, wind 230 degrees, five knots, altimeter 30."
AA  "Roger that"
18:24:10 [flap lever moving into detent]
ST: "Some passenger's pushing a switch. May I?"
所以我决定从简单开始:

 re.findall('("|\').*?\\1', page)
 ########## /("|').*?\1/ <-- raw regex I think I'm going for.
我真的很困惑,因为等价的(afaik)正则表达式在VIM中工作得很好

\("\|'\).\{-}\1/)
我的问题是:
为什么它只返回括号内的匹配项?这是我理解反向引用的一个缺陷吗?如果是,那么为什么它在VIM中工作

我如何用python编写我想要的正则表达式


谢谢你的帮助

您需要用一对额外的括号捕捉所有内容

re.findall('(("|\').*?\\2)', page)

您需要用一对额外的括号来捕捉所有内容

re.findall('(("|\').*?\\2)', page)

阅读
re.findall
返回组(如果有)。如果需要整个匹配项,则必须将其全部分组,或使用
re.finditer
。请参阅。

阅读
re.findall
返回组(如果有)。如果需要整个匹配项,则必须将其全部分组,或使用
re.finditer
。请参阅。

除了引号之外,您没有捕获任何内容,而Python正在返回引号

如果添加另一个组,情况会好得多:

for quote, match in re.finditer(r'("|\')(.*?)\1', page):
  print match

我在字符串文本前面加了一个
r
,使其成为原始字符串,这在需要使用大量反斜杠(
\\1
变成
\1
)时非常有用。

除了引号之外,您不会捕获任何内容,而Python会返回引号

如果添加另一个组,情况会好得多:

for quote, match in re.finditer(r'("|\')(.*?)\1', page):
  print match

我用
r
作为字符串文字的前缀,使其成为原始字符串,这在需要使用大量反斜杠(
\\1
变成
\1
)时非常有用。

太棒了!但这是否意味着,如果表达式的一部分在控制组中,则其他所有内容也必须在控制组中?匹配组中的内容是使用正则表达式搜索时返回的内容。如果你想让整个正则表达式匹配,你就把所有的东西都打包成一个组。太棒了!但这是否意味着,如果表达式的一部分在控制组中,则其他所有内容也必须在控制组中?匹配组中的内容是使用正则表达式搜索时返回的内容。如果你想让整个正则表达式匹配,你就把所有的东西都打包在一个组中。文档对我来说仍然没有意义,因为我认为组意味着潜在的匹配,而不是控制组。谢谢你澄清。文档对我来说仍然没有意义,因为我认为组意味着潜在的匹配,而不是控制组。谢谢你澄清这一点。