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
相关产品推荐
相关产品推荐

