Select 如果在正则表达式中仅满足几个条件,则为一部分

Select a portion if only several conditions are met in regex

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

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=')]

您可以使用

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

或获得单场比赛:

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

regex demo详情

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

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

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

Regex demo<¯\(ツ)>Python demo

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

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

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

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

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

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

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

1+4 = 2+3