我正在编写一个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中编写我正在寻找的正则表达式?
感谢您的帮助!
答案 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 documentation。 re.findall
返回组,如果有的话。如果您想要整个匹配,则必须将其全部分组,或使用re.finditer
。请参阅this question。