python - Python Regex - 可选匹配,不捕获一个匹配
问题描述
我试图找到一种优雅的方式来同时匹配负数和正数,而不是在捕获 - 符号的同时捕获 + 符号。
所以我有类似的东西:
re.findall("([+-] \d+)x", "6x2 + 4x + 5 - 2x2 - 7x + 4 + 87x - 100x")
这为我提供了 x 的所有乘数,包括正数和负数(太棒了!)。例如,我希望负数- 2
为 ,但不返回正数的加号(4
而不是+ 4
)。我的选项失败了?:
,也许我只是使用不正确。
解决方案
您可以使用交替和积极、前瞻和后视:
(?<=\+) \d+(?=x)|- \d+(?=x)
print(re.findall("(?<=\+) \d+(?=x)|- \d+(?=x)", "6x2 + 4x + 5 - 2x2 - 7x + 4 + 87x - 100x"))
# [' 4', '- 2', '- 7', ' 87', '- 100']
解释
(?<=\+) \d+(?=x)
肯定后向断言左边是 a+
,然后匹配一个空格,后跟一个或多个数字。使用积极的前瞻来断言右侧的内容是x
|
或者- \d+(?=x)
匹配-
,一个空格和一个或多个数字。然后使用积极的前瞻来断言右边的内容是x
如果您不想在没有匹配的情况下包含空格,则+
可以在数字之前将其删除并将其添加到积极的后视:
(?<=\+ )\d+(?=x)|- \d+(?=x)
推荐阅读
- ruby-on-rails - heroku 向下迁移和回滚
- c++ - 使用 BOOST::serialization 将二进制存档写入共享内存
- python - 与滚动区域宽度相关的画布项宽度
- database - 烧瓶和连接到数据库混淆
- swift - SwiftUI:如何将手绘图保存为 UIImage
- flutter - 什么是 Future 以及如何使用它?
- php - 使用 ajax .serializeArray() 更新多行
- javascript - 如何多次显示 span id 数据?
- python - 实现选择类型的 Python 数据类
- formula - Netsuite - 保存的搜索公式(文本)案例语句乘以 2 个字段