从字符串中删除非数字字符

时间:2011-02-22 05:35:49

标签: python

strings = ["1 asdf 2", "25etrth", "2234342 awefiasd"] #and so on

获取[1, 25, 2234342]的最简单方法是什么?

如果没有像(^[0-9]+)这样的正则表达式模块或表达式,

怎么能这样做呢?

5 个答案:

答案 0 :(得分:2)

new = []
for item in strings:
    new.append(int(''.join(i for i in item if i.isdigit())))


print new
[1, 25, 2234342]

答案 1 :(得分:2)

可以编写一个辅助函数来提取前缀:

def numeric_prefix(s):
    n = 0
    for c in s:
        if not c.isdigit():
            return n
        else:
            n = n * 10 + int(c)
    return n

使用示例:

>>> strings = ["1asdf", "25etrth", "2234342 awefiasd"]
>>> [numeric_prefix(s) for s in strings]
[1, 25, 2234342]

请注意,当输入字符串没有数字前缀时(例如空字符串),这将产生正确的输出(零)。

根据Mikel的解决方案,可以编写一个更简洁的numeric_prefix定义:

import itertools

def numeric_prefix(s):
    n = ''.join(itertools.takewhile(lambda c: c.isdigit(), s))
    return int(n) if n else 0

答案 2 :(得分:1)

正则表达式的基本用法:

导入重新

strings = [“1asdf”,“25etrth”,“2234342 awefiasd”]

regex = re.compile('^(\ d *)')

表示字符串中的s:

  mo = regex.match(s)

  print s, '->',  mo.group(0)

1asdf - > 1

25etrth - > 25

2234342 awefiasd - > 2234342

答案 3 :(得分:1)

所以你只需要前导数字?你想避免正则表达式吗?可能会有更短的东西,但这是显而易见的解决方案。

nlist = []
for s in strings:
    if not s or s[0].isalpha(): continue
    for i, c in enumerate(s):
        if not c.isdigit():
            nlist.append(int(s[:i]))
            break
    else:
        nlist.append(int(s))

答案 4 :(得分:1)

基于sahhhm的答案,您可以使用takewhile解决“1 asdf 1”问题。

from itertools import takewhile

def isdigit(char):
  return char.isdigit()

numbers = []
for string in strings:
    result = takewhile(isdigit, string)
    resultstr = ''.join(result)
    if resultstr:
        number = int(resultstr)
        if number:
            numbers.append(number)