如何从string中提取浮动数字

我有一些类似于Current Level: 13.4 db.的stringCurrent Level: 13.4 db. 我只想提取浮点数。 我说浮动,而不是小数,因为它有时是整体。 RegEx能做到这一点,还是有更好的办法?

如果你的浮点数总是用十进制符号表示的话

 >>> import re >>> re.findall("\d+\.\d+", "Current Level: 13.4 db.") ['13.4'] 

可能就足够了。

更健壮的版本将是:

 >>> re.findall(r"[-+]?\d*\.\d+|\d+", "Current Level: -13.2 db or 14.2 or 3") ['-13.2', '14.2', '3'] 

如果你想validation用户input,你也可以通过直接跳转来检查浮点数:

 user_input = "Current Level: 1e100 db" for token in user_input.split(): try: # if this succeeds, you have your (first) float print float(token), "is a float" except ValueError: print token, "is something else" # => Would print ... # # Current is something else # Level: is something else # 1e+100 is a float # db is something else 

你可能喜欢尝试这样的东西,其中涵盖了所有的基础,包括在数字之后不依赖空格:

 >>> import re >>> numeric_const_pattern = r""" ... [-+]? # optional sign ... (?: ... (?: \d* \. \d+ ) # .1 .12 .123 etc 9.1 etc 98.1 etc ... | ... (?: \d+ \.? ) # 1. 12. 123. etc 1 12 123 etc ... ) ... # followed by optional exponent part if desired ... (?: [Ee] [+-]? \d+ ) ? ... """ >>> rx = re.compile(numeric_const_pattern, re.VERBOSE) >>> rx.findall(".1 .12 9.1 98.1 1. 12. 1 12") ['.1', '.12', '9.1', '98.1', '1.', '12.', '1', '12'] >>> rx.findall("-1 +1 2e9 +2E+09 -2e-9") ['-1', '+1', '2e9', '+2E+09', '-2e-9'] >>> rx.findall("current level: -2.03e+99db") ['-2.03e+99'] >>> 

为了便于复制粘贴:

 numeric_const_pattern = '[-+]? (?: (?: \d* \. \d+ ) | (?: \d+ \.? ) )(?: [Ee] [+-]? \d+ ) ?' rx = re.compile(numeric_const_pattern, re.VERBOSE) rx.findall("Some example: Jr. it. was .23 between 2.3 and 42.31 seconds") 

Python文档有一个涵盖+/-和指数表示法的答案

 scanf() Token Regular Expression %e, %E, %f, %g [-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)? %i [-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+) 

此正则expression式不支持逗号用作整个小数部分(3,14159)之间的分隔符的国际格式。 在这种情况下,请全部replace\.[.,]在上面的浮动正则expression式。

  Regular Expression International float [-+]?(\d+([.,]\d*)?|[.,]\d+)([eE][-+]?\d+)? 
 re.findall(r"[-+]?\d*\.\d+|\d+", "Current Level: -13.2 db or 14.2 or 3") 

如上所述,工作真的很好! 一个build议,虽然:

 re.findall(r"[-+]?\d*\.\d+|[-+]?\d+", "Current Level: -13.2 db or 14.2 or 3 or -3") 

也会返回负的int值(比如在这个string的末尾有-3)

我认为在下面的答案中你会发现有趣的东西,我曾经为以前的类似问题做过:

https://stackoverflow.com/q/5929469/551449

在这个答案中,我提出了一个模式,允许正则expression式捕捉任何types的数字,由于我没有别的东西可以添加到它,我认为它是相当完整的

您可以使用以下正则expression式从string中获取整数和浮点值:

 re.findall(r'[\d\.\d]+', 'hello -34 42 +34.478m 88 cricket -44.3') ['34', '42', '34.478', '88', '44.3'] 

感谢雷克斯

另一种可读性更强的方法是简单的types转换。 我已经添加了一个替代函数来涵盖人们可能input欧洲小数点的情况:

 >>> for possibility in "Current Level: -13.2 db or 14,2 or 3".split(): ... try: ... str(float(possibility.replace(',', '.'))) ... except ValueError: ... pass '-13.2' '14.2' '3.0' 

然而这也有缺点。 如果有人input“1000”,这将被转换为1.此外,它假定人们将input与单词之间的空白。 其他语言如中文则不然。

Interesting Posts