【问题标题】:Regex search to extract float from string. Python正则表达式搜索以从字符串中提取浮点数。 Python
【发布时间】:2014-02-05 00:50:00
【问题描述】:
import re

sequence = 'i have -0.03 dollars in my hand'

m = re.search('(have )(-\w[.]+)( dollars\w+)',sequence)

print m.group(0)
print m.group(1)
print m.group(2)

寻找一种在两次出现之间提取文本的方法。在这种情况下,格式是“我有”后跟 - 浮点数,然后是“美元\w+”

我如何使用 re.search 来提取这个浮点数? 为什么这些小组不以这种方式工作?我知道我可以进行一些调整以使其与这些组一起工作。任何帮助将不胜感激

我以为我可以使用带括号的组,但我出错了

【问题讨论】:

  • 你手里怎么会有-0.03美元? :)

标签: python regex search find


【解决方案1】:

-\w[.]+ 不匹配 -0.03 因为 [.] 匹配 . 字面意思是因为 .[...] 内。

\wdollars 之后也会阻止模式匹配sequencedollars后面没有单词字符。

使用(-?\d+\.\d+) 作为模式:

import re

sequence = 'i have -0.03 dollars in my hand'

m = re.search(r'(have )(-?\d+\.\d+)( dollars)', sequence)

print m.group(1) # captured group start from `1`.
print m.group(2) 
print m.group(3)

顺便说一句,捕获的组号从1 开始。 (group(0) 返回整个匹配的字符串)

【讨论】:

  • @draconisthe0ry, -? 使 - 可选,因为 <RE>? 匹配 0 或 1 次出现的 RE
【解决方案2】:

您的正则表达式不匹配有几个原因:

  • 它总是需要-(在这种情况下是可以的,一般来说是有问题的)
  • 它要求在 . 之前恰好有一位数字(它甚至允许像 A 这样的非数字)。
  • 它允许任意数量的点,但点后不能再有数字。
  • 它需要紧跟在dollars 之后的一个或多个字母数字。

所以它将匹配 "I have -X.... dollarsFOO in my hand" 但不匹配 "I have 0.10 dollars in my hand"

此外,将固定文本放入捕获括号中是没有用的。

m = re.search(r'\bhave (-?\d+\.\d+) dollars\b', sequence)

会更有意义。

【讨论】:

    【解决方案3】:

    这个问题之前已经在许多表述中提出过。您正在寻找可以找到数字的正则表达式。由于数字格式可能包括小数、逗号、指数、加号/减号和前导零,因此您需要一个健壮的正则表达式。幸运的是,这个正则表达式已经为你编写好了。

    How to extract a floating number from a stringRegular expression to match numbers with or without commas and decimals in text

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      相关资源
      最近更新 更多