【问题标题】:Filtering text in python for numeric values在python中过滤文本以获取数值
【发布时间】:2012-12-14 21:17:00
【问题描述】:

我知道我可以使用正则表达式在 python 中过滤文本中的数字,但这是最好的方法吗?

假设我有一个字符串列表:

a="gamma function: 78"
b="factorial value: 120"
c="random number: 33"

是否有一个很好的功能可以做到以下几点?

for string in [a,b,c]:
    return numbers(string)
78
120
33

【问题讨论】:

  • 这里最好的意思是 1) 最简单,2) 最快(计算上),按照这个顺序。
  • 每个字符串总是只有一个数字吗?它总是一个整数吗?
  • 理想情况下两者都是。我会接受一个假设的答案。
  • 也总是在字符串的末尾,跟在“:”之后?

标签: python regex


【解决方案1】:

是的,我认为正则表达式是解决此问题的理想工具:

def numbers(s):
    return int(re.search(r"\d+", s).group(0))

对于多个数字的字符串:

def numbers(s):
    return [int(match) for match in re.findall(r"\d+", s)]

甚至

def numbers(s):
    return (int(match) for match in re.finditer(r"\d+", s))

【讨论】:

  • 一个map 似乎在这里:map(int, re.findall("\d+", s)。但是+1,正是我会做的:)
【解决方案2】:

只需过滤掉生成器表达式中的非数字:

a="gamma function: 78"
b="factorial value: 120"
c="random number: 33"

numbers = []
for string in [a,b,c,]:
    numbers.append( int("".join(char for char in string if char.isdigit())))

将其粘贴到控制台上,我得到:

>>> numbers
[78, 120, 33]

【讨论】:

  • 这适用于每个字符串中的一个数字,即使数字被其他字符稀疏。如果存在每个字符串中可能有多个数字的情况,请澄清您的问题 - 哦,我现在在您的 cmets 中看到了。
猜你喜欢
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多