【问题标题】:Select a portion if only several conditions are met in regex如果在正则表达式中只满足几个条件,则选择一部分
【发布时间】:2022-01-02 05:35:12
【问题描述】:

我有一些简单的方程式,您不知道结果的位置(在末尾或开头)。想出了这个正则表达式(下面的代码),但它也选择了一个等号,这是预期的。我可以将等号替换为空,但这绝对不是正确的方法。那么如何只选择匹配的一部分呢?

from re import compile,findall

regex = compile(r'(\d+=)?\d+\+\d+(=\d+)?')
print(findall(regex,'1+2=3'))
#Expected: [('', '3')]
#Actual: [('', '=3')]
print(findall(regex,'3=1+2'))
#Expected: [('', '3')]
#Actual: [('', '3=')]

【问题讨论】:

    标签: python regex regex-group


    【解决方案1】:

    你可以使用

    matches = re.findall(r'(?<==)\d+$|^\d+(?==)', text)
    

    或者得到一个匹配:

    match = re.search(r'(?<==)\d+$|^\d+(?==)', text)
    if match:
        print(match.group())
    

    请参阅regex demo详情

    • (?&lt;==)\d+$ - 紧跟在 = 前面的位置,然后消耗一个或多个数字,然后应该跟随字符串的结尾
    • | - 或
    • ^\d+(?==) - 字符串开头 (^),一个或多个数字,然后必须跟一个 =

    【讨论】:

      【解决方案2】:

      您可以通过以下方式获取感兴趣的字符串:

      rgx = r'^\-?\d+(?:\.\d+)?(?= *=)|\-?\d+(?:\.\d+)?$'
      
      value = re.search(rgx, str).group(0)
      

      Regex demo¯\(ツ)>Python demo

      正则表达式,其中包含一个交替,首先尝试匹配(字符串表示)从字符串开头开始的整数或浮点数,后跟等号,中间可能有空格:

      ^\-?\d+(?:\.\d+)?(?= *=)
      

      (?= *=) 是一个正向预测,它断言匹配的数字后跟零个或多个空格,然后是一个等号。

      因为我们使用re.search,它只返回第一个匹配,如果匹配成功,我们就完成了。如果匹配失败,我们知道数字必须在字符串的末尾,因此,交替的第二部分是:

      \-?\d+(?:\.\d+)?$
      

      您可能希望将光标悬停在正则表达式链接上的正则表达式的每个部分上,以获得对其功能的解释。

      请注意,此表达式不会验证字符串是否具有所需的格式。例如,如果字符串是:它将返回3

      1+4 = 2+3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 2020-12-29
        • 1970-01-01
        • 2020-09-19
        相关资源
        最近更新 更多