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

时间:2012-07-28 18:23:13

标签: python regex quotes parentheses backreference

我正在编写一个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.

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

  1. (“|”)匹配单个或双引号,另存为后引用/ 1。
  2. 。*?匹配非贪婪的通配符。
  3. \ 1匹配在后引用\ 1中找到的任何内容(第一步)。
  4. 相反,它会返回一个引号数组,但绝不会返回任何其他内容。

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

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

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

    我的问题是:
    为什么它只返回括号内的内容?这是我对背面参考的理解中的一个缺陷吗?如果是这样,为什么它在VIM中有用?

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

    感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

除了引号之外,你没有捕获任何东西,这正是Python的回归。

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

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

我为您的字符串文字添加r前缀,使其成为原始字符串,当您需要使用大量反斜杠时,此字符串很有用(\\1变为{{ 1}})。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

阅读the documentationre.findall返回组,如果有的话。如果您想要整个匹配,则必须将其全部分组,或使用re.finditer。请参阅this question