我有几百万个方程,比如: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。我强烈推荐它用于构建正则表达式!