如何在python中编写一个正则表达式,该表达式在字符串的第一个句点处停止,因为字符串中的字符种类不可预测



我有几百万个方程,比如:an equation: a(%)^ + b# = (+)C!.

我想要返回的是:a(%)^ + b# = (+)C!

对于等式来说永远是正确的:
1。它将以"一个方程式:">
2开始。它将在两个空格之间包含一个等号(=(
3.它将包含两个空格之间任意数量的加号(+(
4.它将以句点(.(结束。

可能是真的事情:
1。该方程式可以包含额外的+和=,但不能用空格表示
2.公式可以包含句点后面的附加信息,并且该信息可以包含句点。例如:

an equation: a(%)^ + b# = (+)C!. An annotation about the (!!*) equation.  

3.我想这个方程式中可能有周期。我对此表示怀疑,我认为如果它们真的发生了,它们将出现在等号的前面(左侧(。
4。这个方程式可能不存在。字符串永远不会为空,但它可能不包含等式(即,具有四个始终为真的标准(。

以下是我目前所拥有的:

e = "an equation: a(%)^ + b# = (+)C!. An annotation about the (!!*) equation."
rx = re.search(r'(?<=an equation:s)(.*=.*).?',e)
print rx.group(0)

让我来解释正则表达式的每一部分:
(r'(?<=an equation:s)找到"一个方程"加上任何数量的空格,但不保留它。
(.*=.*)断言必须有一个等号。我发现这几乎肯定会普遍排除非方程。如果没有,我可以发现并处理一些杂项案件
.?在我看来,这应该找到=符号后的第一个句点(即,从.using的典型解释中逃脱(,然后停止。然而,事实并非如此。

我的正则表达式返回:

a(%)^ + b# = (+)C!. An annotation about the (!!*) equation.

我认为.?和正则表达式的贪婪性质是问题所在。我已经尝试了许多其他有.?的组合,以及有和没有()[]。这些都返回如上所述的关于注释的第二条语句或NoneType(即,不匹配(。我现在完全不知道如何在第一节课结束后停下来。

提前感谢您的帮助。我花了两天时间在这个网站上,并使用Python文档来尝试解决这个问题。我就是找不到/不明白我需要什么。

正则表达式的贪婪本质确实是个问题。试试这个:

rx = re.search(r'(?<=an equation:s)(.*=[^.]*).',e)

两个区别是我删除了"?"在你的最后一段时间后,因为根据《永远是真的事》第4条,这不是可选的。然后我告诉等号后的贪婪比特,它可以匹配任何,除了一个句点。这意味着,一旦到达第一个非可选周期,它将停止匹配。

作为一个快速提示,我使用Regex101.com快速调试您的regex。我强烈推荐它用于构建正则表达式!

最新更新