python 在字符串在数字字符和字母字符之间切换的位置拆分字符串

9wbgstp7  于 2023-04-10  发布在  Python
关注(0)|答案(5)|浏览(129)

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

这是相当笨重的,虽然。有没有更简单的方法来分割字符串,从数字转换为字母字符?

jmo0nnb3

jmo0nnb31#

你要求一种方法来分割数字串,但在你的例子中,你实际上想要的只是第一个数字,这很容易用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
ig9co6j1

ig9co6j12#

要按位拆分字符串,可以将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

q43xntqr

q43xntqr3#

正则表达式怎么样?

reg = re.compile(r'(?P<numbers>\d*)(?P<rest>.*)')
result = reg.search(str)
if result:
    numbers = result.group('numbers')
    rest = result.group('rest')
db2dz4w8

db2dz4w84#

答案添加作为解决如何将字符串按数字拆分为列表的可能方法?这是dupe-linked
你可以自己做分割:

  • 使用临时列表来累积非数字的字符
  • 如果你找到一个数字,将临时列表(''.join()-艾德)添加到结果列表中(仅当不为空时),并且不要忘记清除临时列表
  • 重复此操作,直到处理完所有字符,如果临时列表中仍有内容,则添加它
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']

参考文献:

46qrfjad

46qrfjad5#

Cnicutar回答的更清晰版本

import re
 
str_to_split = "test123"
 
temp = re.compile("([a-zA-Z]+)([0-9]+)")
res = temp.match(str_to_split).groups()
 
print("The tuple after the split of string and number : " + str(res))

相关问题