代码之家  ›  专栏  ›  技术社区  ›  17th Lvl Botanist

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

  •  1
  • 17th Lvl Botanist  · 技术社区  · 6 年前

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

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

    对于等式来说,总是正确的:
    一。它将以“方程式”开头:
    2。它将在两个空格之间包含等号(=)。
    三。它将在两个空格之间包含任意数量的加号(+)。
    四。它将以句号(.)结束。

    可能是真的:
    一。方程可以包含附加的+和=,但不能用空格来描述。
    2。方程可以包含周期之后的附加信息,并且该信息可以包含周期。例如:

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

    三。我想方程中可能有周期。我对此表示怀疑,我认为如果真的发生了,它们会出现在等号的前面(左边)。
    四。该方程可能不存在。字符串永远不会为空,但它可能不包含公式(即,具有四个始终为真的条件)。

    以下是我目前掌握的情况:

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

    让我解释一下regex的每个部分:
    (r'(?<=an equation:\s) 查找“方程式”加上任意数量的空格,但不保留它。
    (.*=.*) 断言必须有一个等号。我发现这几乎肯定会排除非方程组。如果没有,我可以发现和处理一些其他案件。
    .\? 在我看来,这应该是第一个时期(即从典型的解释中逃脱出来)。使用)在=符号后,然后停止。然而,事实并非如此。

    我的正则表达式返回:

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

    我想是的 .\? 而regex的贪婪本质就是问题所在。我试过很多其他的组合 .\ ? [] 有无 () . 所有这些都返回上述关于注释的第二条语句或 NoneType (即不匹配)。我现在完全不知道第一节课之后该怎么停。

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   webMan1    6 年前

    regex的贪婪本质确实是问题所在。请改为:

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

    两个不同之处在于我去掉了“?”在你的最后一节课结束后,因为这是不可选择的,根据事情总是会是真的。然后我告诉等号后面的贪心点它可以匹配任何东西 除了 一段时间。这意味着一旦到达第一个非可选周期,它将停止匹配。

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