首页 > 解决方案 > Python Regex - 可选匹配,不捕获一个匹配

问题描述

我试图找到一种优雅的方式来同时匹配负数和正数,而不是在捕获 - 符号的同时捕获 + 符号。

所以我有类似的东西:

re.findall("([+-] \d+)x", "6x2 + 4x + 5 - 2x2 - 7x + 4 + 87x - 100x")

这为我提供了 x 的所有乘数,包括正数和负数(太棒了!)。例如,我希望负数- 2为 ,但不返回正数的加号(4而不是+ 4)。我的选项失败了?:,也许我只是使用不正确。

标签: pythonregexregex-lookaroundsoptional-parameters

解决方案


您可以使用交替和积极、前瞻和后视:

(?<=\+) \d+(?=x)|- \d+(?=x)

print(re.findall("(?<=\+) \d+(?=x)|- \d+(?=x)", "6x2 + 4x + 5 - 2x2 - 7x + 4 + 87x - 100x"))
# [' 4', '- 2', '- 7', ' 87', '- 100']

正则表达式演示| Python 演示

解释

  • (?<=\+) \d+(?=x)肯定后向断言左边是 a +,然后匹配一个空格,后跟一个或多个数字。使用积极的前瞻来断言右侧的内容是x
  • |或者
  • - \d+(?=x)匹配-,一个空格和一个或多个数字。然后使用积极的前瞻来断言右边的内容是x

如果您不想在没有匹配的情况下包含空格,则+可以在数字之前将其删除并将其添加到积极的后视:

(?<=\+ )\d+(?=x)|- \d+(?=x)


推荐阅读