给定一个字符串(文本文件中的行),我想找到像这样构建的所有子字符串:
[[ 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/