python - 查找重叠的匹配项

标签 python regex python-3.x

给定一个字符串(文本文件中的行),我想找到像这样构建的所有子字符串:

[[ words ]]

例如:

[[foo [[ bar ]]

应该返回两者

[[foo [[ bar ]]

[[ bar ]]

另一个例子:

[[foo]] and [[bar]]

应该产生

[[foo]]

[[bar]]

我想到了一个类似的论坛

\[\[.+\]\]

但它无法正常工作(匹配太多)。

感谢您的帮助!

最佳答案

重叠匹配:使用 Lookahead

对于惰性重叠,请使用此正则表达式:

(?=(\[\[.?*\]\]))

在Python中:

import re
pattern = r"(?=(\[\[.*?\]\]))"
print(re.findall(pattern, "[[foo [[ bar ]]"))
print(re.findall(pattern, "[[foo]] and [[bar]]"))

输出:

['[[foo [[ bar ]]', '[[ bar ]]']
['[[foo]]', '[[bar]]']

对于“贪婪重叠”,请使用 (?=(\[\[.*\]\]))

输出:

['[[foo [[ bar ]]', '[[ bar ]]']
['[[foo]] and [[bar]]', '[[bar]]']

说明

  • 前瞻 (?= ... ) 断言括号内的内容可以匹配(但不匹配,以便我们可以找到重叠的匹配项)
  • `([[.*]]) 两边的括号将匹配的字符串捕获到组 1
  • \[\[ 匹配 [[
  • .* 贪婪地匹配任何字符
  • .*? 中的星号量词被 ? 变得“惰性”,以便点仅匹配所需数量的字符,以允许下一个标记匹配(最短匹配)。如果没有 ?.* 首先匹配整个字符串,然后仅根据需要回溯以允许下一个标记匹配(最长匹配)。
  • \]\] 匹配 ]]

引用

关于python - 查找重叠的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24922121/

相关文章:

python - 使用 clint 进度条显示 urllib.urlretrieve() 的状态

javascript - IP 地址验证的正则表达式

regex - 正则表达式量词加号和星号的区别

Python通过线程tkinter进行通信

用于对关键字进行分类的 Python 包

python - 从数据框中删除重复项的每个实例

c# - 用于验证电话的正则表达式

python - 如何将csv文件中的数据插入sqlite db?

python - 削减成本算法优化

python - python中的空错误消息