Python re 正则表达式的问题,匹配薪水 low 和 high

2021-03-16 19:28:27 +08:00
 chizuo

需求:一次匹配,匹配薪水 low 和 high

字段例子:

  1. 0.7-1 万 /元;我想要得到[0.7, 1]
  2. 7 万元;我想要得到[7]
  3. 0.7 万元;我想要得到[0.7]
  4. 13.88-20.5 万 /元;我想要得到[13.88, 20.5]
  5. 2-20.5 万 /元;我想要得到[2, 20.5]
  6. 1-20 万 /元;我想要得到[1, 20]

在正则表达式在线上( https://c.runoob.com/front-end/854 ) 用这个\d+(\.\d+)?能测试通过

但是使用python re.findall(pattern, str)得到结果却不尽如人意

例如:0.7-1 万 /元;我想要得到[0.7, 1]

s = "0.7-1 万 /元"
p = "\d+(\.\d+)?"
print(re.findall(p, s))
# 得到[0, 7, 1]

求助各位大伙,有无 python 一次匹配可以得到的方法,谢谢啦

1754 次点击
所在节点    Python
9 条回复
Mitt
2021-03-16 19:33:04 +08:00
([0-9\.]+)(?:-([0-9\.]+))?
pakro888
2021-03-16 19:39:54 +08:00
@Mitt #1 楼主似乎不需要匹配“-”

删掉应该就匹配楼主的要求了:

([0-9\.]+)(?:([0-9\.]+))?
chizuo
2021-03-16 20:01:02 +08:00
@Mitt @pakro888

谢谢谢谢!我发现我好像理解错()圆括号的用途了,我以为的是将圆括号里的内容打包,比如(abc)?代表 abc 出现 0 次或 1 次,但我又查了下,这个群组大概是多种匹配的意思。

使用(?:abc)?即圆括号里开头加上?:才是我想要的“打包”的意思,我这样理解对吗?所以表达式可以\d+(?:\.\d+)?

非常感谢!
zyb201314
2021-03-16 21:24:30 +08:00
这里(?:exp)没有必要吧?
还有例子字符串中除了 float 中有'点', 没有其它单独的'点'.那么直接获取数字和点就 ok 了.如:
s="0.7-1 万 /元;"
print(re.findall("[\d\.]+" , s))
chizuo
2021-03-16 22:51:05 +08:00
@zyb201314 优秀,你这个是最简洁的,但是我还是用我那个,更严格一些,你懂得,你永远也不知道未知的数据长啥样 hhh
HelloViper
2021-03-17 10:26:21 +08:00
贪婪匹配啊,"[0-9.]{1,}"
secsilm
2021-03-17 16:14:05 +08:00
@chizuo 没错,括号的作用有两种:分组和改变运算符优先级顺序。默认情况下是后者,但如果只想分组,那么就得加上 `?:`。
secsilm
2021-03-17 16:15:46 +08:00
@secsilm 加上 `?:` 后,更准确地说,就变成了 non-capturing group 。
chizuo
2021-03-17 21:19:35 +08:00
@secsilm 学到了,非常感谢!

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

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

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

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

© 2021 V2EX