regex在子字符串的第一个出现之后查找数字



我有一句话:

"Fourth-quarter 2021 net earnings per share (EPS) of $1.26, compared with 2020 EPS of $1.01; Fourth-quarter 2021 adjusted EPS of $1.11, down 25.5 percent compared with 2020 adjusted EPS of $1.49"

并且希望在第一个子串"0"之后得到数字$1.11;调整后的EPS";。

我能提供的最好的正则表达式是:

re.search("^.*Adjusted EPS.*?($d+.d+).*", text,re.IGNORECASE).group(1)

但这在第二次出现"0"之后给了我数字$1.49;调整后的EPS";。

如何修改搜索以获得1.11美元的数字?

这个正则表达式字符串应该可以工作。/adjusted EPS of ?($d+.d+)/g

输入:

Fourth-quarter 2021 net earnings per share (EPS) of $1.26, compared with 2020 
EPS of $1.01; Fourth-quarter 2021 adjusted EPS of $1.11, down 25.5 percent 
compared with 2020 adjusted EPS of $1.49

输出:调整后每股收益1.11美元,调整后每股收益1.49美元

编辑:删除Regex字符串末尾的g,只查找一个匹配项。

您可以使用此模式来查找;调整后的EPS";并且只允许一个"$"在它和线的末端之间。

/adjusted EPS[^$]+($d+.d+)[^$]+$/gm

没有结尾的图案是

adjusted EPS[^$]+($d+.d+)[^$]+$

这里的问题是贪婪正则表达式,您刚开始使用它:

^.*Adj ...

^表示字符串的开始。贪婪的.*";吃";尽可能多的字符直到最后一个";调整后的EPS";

这里有两种解决方案,要么使其成为非贪婪(即懒惰(^.*?Adj ...,要么完全删除^.*——我认为没有使用它

最新更新