22

我正在解析一些标准格式类似于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)

不过,这很笨拙。有没有更简单的方法来拆分从数字转换为字母字符的字符串?

4

4 回答 4

33

您要求一种将字符串拆分为数字的方法,但在您的示例中,您真正想要的只是第一个数字,这很容易完成itertools.takewhile()

>>> int("".join(itertools.takewhile(str.isdigit, "10pizzas")))
10

这很有意义——我们正在做的是从字符串中取出字符,而它们是数字。这样做的好处是一旦我们到达第一个非数字字符就停止处理。

如果您也需要后面的数据,那么您正在寻找的内容itertools.groupby()与简单的列表理解混合在一起:

>>> ["".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
于 2012-12-02T21:04:34.447 回答
23

要将字符串拆分为数字,您可以使用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.

于 2012-12-02T21:04:26.707 回答
3

正则表达式怎么样?

reg = re.compile(r'(?P<numbers>\d*)(?P<rest>.*)')
result = reg.search(str)
if result:
    numbers = result.group('numbers')
    rest = result.group('rest')
于 2012-12-02T21:04:04.403 回答
0

答案添加为解决如何将字符串按数字拆分为列表的可能方法?这就是dupe-linked这个问题。

您可以自己进行拆分:

  • 使用临时列表来累积非数字字符
  • 如果找到一个数字,将临时列表 ( ''.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']

参考:

于 2018-09-21T12:41:04.267 回答