0

我正在编写一个 python 正则表达式,它通过文本文档查找引用的字符串(从黑盒记录的航空公司飞行员的引用)。我首先尝试使用以下规则编写正则表达式:

返回引号之间的内容。
如果它以单人打开,则仅在以单人关闭时返回。
如果它以双精度打开,则仅在以双精度关闭时返回。

例如,我不想匹配“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.

这个正则表达式的行为非常出乎意料。
我以为会:

  1. ( " | " ) 匹配单引号或双引号,另存为反向引用 /1。
  2. .*? 匹配非贪心通配符。
  3. \1 匹配它在反向引用 \1 中找到的任何内容(第一步)。

相反,它返回一个引号数组,但从不返回任何其他内容。

['"', '"', "'", "'"]

我真的很困惑,因为等效的(afaik)正则表达式在 VIM 中工作得很好。

\("\|'\).\{-}\1/)

我的问题是:
为什么它只返回括号内的匹配项?这是我对反向引用理解的缺陷吗?如果是这样,为什么它可以在 VIM 中工作?

以及如何编写我在 python 中寻找的正则表达式?

谢谢您的帮助!

4

3 回答 3

3

除了引号之外,您没有捕获任何内容,这是 Python 返回的内容。

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

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

我为您的字符串文字加上了前缀r,使其成为原始字符串,这在您需要使用大量反斜杠(\\1变得\1)时很有用。

于 2012-07-28T18:31:26.000 回答
1

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

re.findall('(("|\').*?\\2)', page)
于 2012-07-28T18:29:25.450 回答
0

阅读文档re.findall返回组,如果有的话。如果您想要整个匹配,则必须将其全部分组,或使用re.finditer. 看到这个问题

于 2012-07-28T18:30:20.060 回答