我正在解析一些标准格式类似于10 pizzas
的数据。有时,数据输入正确,我们最终可能会使用5pizzas
而不是5 pizzas
。在这种情况下,我想解析比萨饼的数量。
这种天真的做法是逐个字符检查,构建一个字符串,直到我们达到非数字,然后将该字符串转换为整数。
num_pizzas = ""
for character in data_input:
if character.isdigit():
num_pizzas += character
else:
break
num_pizzas = int(num_pizzas)
但是,这非常笨重。是否有更简单的方法将字符串从数字切换为字母字符?
答案 0 :(得分:26)
你想办法在数字上拆分一个字符串,但是在你的例子中,你真正想要的只是第一个数字,这可以通过itertools.takewhile()
轻松完成:
>>> int("".join(itertools.takewhile(str.isdigit, "10pizzas")))
10
这很有意义 - 我们正在做的是从字符串中取出字符,而它们是数字。这样做的好处是,只要我们到达第一个非数字字符就停止处理。
如果您还需要以后的数据,那么您要找的是itertools.groupby()
与简单的list comprehension混合:
>>> ["".join(x) for _, x in itertools.groupby("dfsd98sd8f68as7df56", key=str.isdigit)]
['dfsd', '98', 'sd', '8', 'f', '68', 'as', '7', 'df', '56']
如果你想创造一个巨大的数字:
>>> int("".join("".join(x) for is_number, x in itertools.groupby("dfsd98sd8f68as7df56", key=str.isdigit) if is_number is True))
98868756
答案 1 :(得分:19)
要将字符串拆分为数字,您可以将re.split
与正则表达式\d+
一起使用:
>>> import re
>>> def my_split(s):
return filter(None, re.split(r'(\d+)', s))
>>> my_split('5pizzas')
['5', 'pizzas']
>>> my_split('foo123bar')
['foo', '123', 'bar']
要查找第一个号码,请使用re.search
:
>>> re.search('\d+', '5pizzas').group()
'5'
>>> re.search('\d+', 'foo123bar').group()
'123'
如果您知道号码必须位于字符串的开头,那么您可以使用re.match
代替re.search
。如果您想查找所有数字并丢弃其余数字,可以使用re.findall
。
答案 2 :(得分:2)
正则表达式怎么样?
reg = re.compile(r'(?P<numbers>\d*)(?P<rest>.*)')
result = reg.search(str)
if result:
numbers = result.group('numbers')
rest = result.group('rest')
答案 3 :(得分:0)
答案中添加了解决此问题dupe-linked
的{{3}}的可能方法。
您可以自己分割:
''.join()
-ed)添加到结果列表中(仅当不为空时),并且不要忘记清除临时列表text = "Ka12Tu12La"
splitted = [] # our result
tmp = [] # our temporary character collector
for c in text:
if not c.isdigit():
tmp.append(c) # not a digit, add it
elif tmp: # c is a digit, if tmp filled, add it
splitted.append(''.join(tmp))
tmp = []
if tmp:
splitted.append(''.join(tmp))
print(splitted)
输出:
['Ka', 'Tu', 'La']
参考文献: