我正在编写一个 python 正则表达式,它可以在文本文档中查找引用的字符串(从黑匣子中记录的航空公司飞行员的引用)。我首先尝试编写具有以下规则的正则表达式:
返回引号之间的内容。
如果以 single 打开,则仅在以 single 关闭时返回。
如果以 double 开头,则仅在以 double 结尾时返回。
例如,我不想匹配“嗨那里”或“嗨那里”,而是匹配“嗨那里”和“嗨那里”。
我使用一个测试页面,其中包含以下内容:
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 匹配在反向引用 \1 中找到的任何内容(第一步)。
相反,它返回一个引号数组,但不返回任何其他内容。
['"', '"', "'", "'"]
我真的很困惑,因为等效的(据我所知)正则表达式在 VIM 中工作得很好。
\("\|'\).\{-}\1/)
我的问题是这样的:
为什么它只返回括号内的内容作为匹配项?这是我对反向引用的理解中的一个缺陷吗?如果是这样那为什么它在 VIM 中有效?
如何在 python 中编写我正在寻找的正则表达式?
感谢您的帮助!
除了引号之外,您没有捕获任何内容,这是 Python 返回的内容。
如果添加另一个组,事情会更好:
for quote, match in re.finditer(r'("|\')(.*?)\1', page):
print match
我在你的字符串文字前面加上了前缀r
使其成为raw字符串,当您需要使用大量反斜杠时,这很有用(\\1
变成\1
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)