正则表达式找不到所有
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}
标记。我在这里也使用全点模式,这样 .*
就可以跨行匹配。此外,您还有一些正则表达式元字符,例如 {
,需要使用反斜杠进行转义。
下面的代码可以直接运行。我想要的是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}
标记。我在这里也使用全点模式,这样 .*
就可以跨行匹配。此外,您还有一些正则表达式元字符,例如 {
,需要使用反斜杠进行转义。