拆分字符串,在字符串之间切换数字和字母字符

时间:2012-12-02 20:58:16

标签: python

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

答案 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']

参考文献: