10

使用 Python,我如何/应该将具有数字、后跟其他字符的字符串解析为 int?我要解决的具体问题是从包含一个数字的字符串中解析第一个数字,然后是任意数量的其他字符,包括可能是其他我不感兴趣的数字。

例如,如果字符串是"12//1" 我只需要得到12一个整数。

4

5 回答 5

19

如果要提取字符串中的数字:

int(''.join(c for c in s if c.isdigit()))
于 2013-07-26T18:15:04.540 回答
11

我会使用这个正则表达式:

import re
try:
    print int(re.compile("(\d+)").match('12//').group(1))
except:
    print "there was no number"

它将提取所有数字并在第一个非数字字符处停止。

\d表示单个数字,\d+表示匹配至少一个数字,并且(\d+)一起表示返回您在第 1 组中找到的内容。

于 2013-07-26T18:15:17.557 回答
9

看起来像一份工作itertools.takewhile

>>> from itertools import takewhile
>>> s = '12//'
>>> int(''.join(takewhile(str.isdigit, s)))
12
于 2013-07-26T18:25:42.293 回答
4

这是一种很酷的技术,但如果它只是你描述的格式,它可能会有点矫枉过正:

import string
potential_bad_characters = string.ascii_puctuation + string.ascii_letters

int(my_string.translate(None,potential_bad_characters ))

#Or
int(mystring.rstrip(potential_bad_characters))

#Or
int(filter(str.isdigit,my_string))

#Or (kudos @JonClements)
potential_bad_characters = ''.join(map(chr, range(256))).replace('0123456789', '')
...
于 2013-07-26T18:18:53.773 回答
1

类似于 jh314s 解决方案,但只在任何非数字字符之前使用数字(因此 34//98 将变为 34,而不是 3498)。假设字符串是“s”:

nonDigitIdx = [idx for idx,ch in enumerate(s) if not ch.isdigit()][0]
i = int(s[:nonDigitIdx-1])
于 2013-07-26T18:20:32.187 回答