如果在正则表达式中仅满足多个条件,请选择一个部分



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

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())

请参阅正则表达式演示。详情

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

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

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

正则表达式演示<̄\(ツ)Python 演示

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

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

(?= *=)是一个积极的前瞻,它断言数字的匹配后跟零个或多个空格,然后是一个等号。

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

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

您可能希望将光标悬停在正则表达式链接处正则表达式的每个部分上,以获取其功能的说明。

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

1+4 = 2+3

最新更新