正则表达式找不到所有

regular expression can not find all

下面的代码可以直接运行。我想要的是return一个列表:l = [1,2](字符串)。然而,我得到的是第一个“开始”和最后一个“结束”之间的字符串。尽管这是预期的结果之一。我不知道发生了什么。

import re

text = r'''

\begin{figure}
1
\end{figure}

aaa

\begin{figure}
2
\end{figure}

'''

pattern = r"\begin{figure}([\s\S^f]*)\end{figure}"
r = re.findall(pattern, text)


print(r)

* 运算符捕获尽可能多的字符。这意味着它一直捕获到 \end{figure} 的最后一次出现 如果您只想捕获所需数量的字符,请改用 *?pattern = r"\begin{figure}([\s\S^f]*?)\end{figure}".

您的模式有多个问题。这是一个工作版本:

text = r'''

\begin{figure}
1
\end{figure}

aaa

\begin{figure}
2
\end{figure}

'''

pattern = r"\begin\{figure\}(?:(?!\end\{figure\}).)*?(\d+).*?\end\{figure\}"
nums = re.findall(pattern, text, flags=re.DOTALL)
print(nums)  # ['1', '2']

注意:我正在使用调和点来匹配前导 \begin{figure} 标记之后的内容,而不跨越结束 \end{figure} 标记。我在这里也使用全点模式,这样 .* 就可以跨行匹配。此外,您还有一些正则表达式元字符,例如 {,需要使用反斜杠进行转义。