帮我看下这个正则表达式

2018-12-28 12:15:29 +08:00
 fan2006
下面这个正则:
re.findall(r'(?<!数量)\d+','数量 123 单价 45 金额 5535')
得到了结果:
['23', '45', '5535']
我想以否定的模式来写,就是不想提取数量后面的数值,在结果的 list 里面数量那个 23 不应该出现的。
2137 次点击
所在节点    Python
10 条回复
fan2006
2018-12-28 12:36:19 +08:00
自己研究写了一个出来。python 3
re.findall(r'[一-龥]+(?<!数量)(\d+)','数量 123 单价 45 金额 5535')
结果:
['45', '5535']
no1xsyzy
2018-12-28 12:41:57 +08:00
因为匹配了 “数量 1 ”
re.findall(r'(?<!数量)\s(\d+)','数量 123 单价 45 金额 5535')
fan2006
2018-12-28 12:50:15 +08:00
@no1xsyzy 嗯,非常感谢大大
nekoneko
2018-12-28 13:25:53 +08:00
数量和\d 中间加个空格试试
fan2006
2018-12-28 13:30:30 +08:00
@nekoneko 其实字符串之间没有空格,我那个还是能起作用
nekoneko
2018-12-28 13:40:04 +08:00
@fan2006 (?<!数量\d*)\d+
imn1
2018-12-28 13:52:14 +08:00
空格是 V2 后台加的么?
python 的 re.findall 总有难以预想的情况
正常理解,「(?<!数量)\d+」和「(?<!数量)(\d+)」是一样的,似乎 python 里面有优先级的区别
fan2006
2018-12-28 14:31:21 +08:00
@nekoneko 你这个报错。提示 look-behind requires fixed-width pattern
fan2006
2018-12-28 14:37:07 +08:00
@imn1 确实后台加的。。\d+没括号就会捕捉带文字数值,应该是匹配整个 pattern 作为分组,带了括号就会只取得数字匹配括号分组。
nekoneko
2019-01-04 13:33:12 +08:00
@fan2006 编译器的锅好像,不支持不定长度。(?<!数量[0-9]{0,100000})[0-9]+这样就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/521846

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX