You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.6中用正则匹配价格,排除特定关键词后的价格

匹配价格并排除特定关键词后的价格(Python 3.6)

需求回顾

你需要从以下字符串中提取所有价格,但要排除紧跟在badword或badword2这类关键词后的价格:

foo bar $ 123.456 bar foo $ 652 $ 1.255.250 bar $ 2.000 foo badword $ 300.000 foo bar $ 123 badword2 $ 400

需要匹配的价格:

  • 123.456
  • 652
  • 1.255.250
  • 2.000
  • 123

不需要匹配的价格:

  • 300.000(紧跟badword)
  • 400(紧跟badword2)

正则方案设计

你之前用的(\d+).(\d+)只能匹配带小数点的价格,而且没处理排除关键词的逻辑。我们可以用负向预查来实现排除规则,同时调整正则匹配所有符合格式的价格(包括整数和带多个小数点的千分位格式)。

最终的正则表达式如下:

(?<!badword\d?\s\$)\s\$\s(\d+(?:\.\d+)*)

正则解释

  • (?<!badword\d?\s\$):负向预查,确保当前位置前面不是badword(或badword2这类带数字的变体)加空格加$的组合,直接排除关键词后的价格。
  • \s\$\s:匹配价格前的$(前后带空格),精准定位价格的前缀标识。
  • (\d+(?:\.\d+)*):匹配价格本身,支持整数(如652、123)和带多个小数点的千分位格式(如1.255.250、2.000),其中(?:\.\d+)*表示可以有0个或多个.\d+组合,非捕获组不干扰最终提取的分组结果。

Python 3.6 代码示例

import re

text = "foo bar $ 123.456 bar foo $ 652 $ 1.255.250 bar $ 2.000 foo badword $ 300.000 foo bar $ 123 badword2 $ 400"
pattern = r'(?<!badword\d?\s\$)\s\$\s(\d+(?:\.\d+)*)'
matches = re.findall(pattern, text)

print("提取到的价格:")
for price in matches:
    print(f"- {price}")

运行这段代码会输出:

提取到的价格:
- 123.456
- 652
- 1.255.250
- 2.000
- 123

如果你的关键词不止badword和badword2,可以扩展负向预查部分,比如用(?<!(badword|anotherword|thirdword)\d?\s\$)来匹配多个关键词的情况。

内容的提问来源于stack exchange,提问作者Argo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:36:47