从具有后缀的字符串中解析数字的 Pythonic 方法
Pythonic way to parse a number out of a string that has a postfix
使用Python 3.
我有一个字符串,例如 128kb/s
、5mb/s
,或者像 42!
这样简单的字符串。数字字符和它的后缀之间没有 space,所以我不能直接调用 int(text)
。
而我只想将 128
、5
和 42
的值捕获为一个整数。
目前,我刚刚编写了一个辅助函数,将所有数字累积到一个字符串中,并在第一个非数字字符处中断。
def read_int_from_string(text):
s = ""
val = 0
for c in text:
if (c >= '0') and (c <= '9'):
s += c
else:
break
if s:
val = int(s)
return val
上面的工作正常,但是有没有更pythonic的方法来做到这一点?
你可以用str.isdigit,这个怎么样?
>> int(filter(str.isdigit, '128kb/s'))
128
for Python 3. 因为过滤器 returns 在 Python 3
中可迭代
int(''.join(filter(str.isdigit, '128kb/s')))
这是正则表达式似乎合理的场景之一:
import re
leadingdigits = re.compile(r'^\d+')
def read_int_from_string(text):
return int(leadingdigits.match(text).group(0))
如果你讨厌正则表达式,你可以这样做基本上将你原来的循环逻辑推到 C 层,虽然它可能会更慢:
from itertools import takewhile
def read_int_from_string(text):
return int(''.join(takewhile(str.isdigit, text)))
使用Python 3.
我有一个字符串,例如 128kb/s
、5mb/s
,或者像 42!
这样简单的字符串。数字字符和它的后缀之间没有 space,所以我不能直接调用 int(text)
。
而我只想将 128
、5
和 42
的值捕获为一个整数。
目前,我刚刚编写了一个辅助函数,将所有数字累积到一个字符串中,并在第一个非数字字符处中断。
def read_int_from_string(text):
s = ""
val = 0
for c in text:
if (c >= '0') and (c <= '9'):
s += c
else:
break
if s:
val = int(s)
return val
上面的工作正常,但是有没有更pythonic的方法来做到这一点?
你可以用str.isdigit,这个怎么样?
>> int(filter(str.isdigit, '128kb/s'))
128
for Python 3. 因为过滤器 returns 在 Python 3
中可迭代int(''.join(filter(str.isdigit, '128kb/s')))
这是正则表达式似乎合理的场景之一:
import re
leadingdigits = re.compile(r'^\d+')
def read_int_from_string(text):
return int(leadingdigits.match(text).group(0))
如果你讨厌正则表达式,你可以这样做基本上将你原来的循环逻辑推到 C 层,虽然它可能会更慢:
from itertools import takewhile
def read_int_from_string(text):
return int(''.join(takewhile(str.isdigit, text)))