从字符串向列表中添加不同的项

2024-04-19 18:50:26 发布

您现在位置:Python中文网/ 问答频道 /正文

假设有一个字符串可以是:

  • “3d6”
  • “t3d6”
  • “3h4d6”
  • “t3h4d6”
  • “6 t3d6”
  • “6 t3h4d6+6”和类似的可能变化。你知道吗

有没有一种方法可以遍历字符串并根据字母/数字/符号/其他内容将其中的项目添加到列表中?例如,"6 t3h10d6+6"将导致[6, " ", "t", 3, "h", 10, "d", 6, "+", 6]作为列表。你知道吗

我正在开发一个telegrambot,它使用python用骰子计算结果回答用户的输入,最困难的部分是处理用户的输入。现在输入正在通过笨拙的if语句进行处理。也许有更好的方法来处理用户输入,我很高兴听到你的建议!你知道吗

不是this question的副本。问题是把一个字符串分解成一系列字符,基本上把一个字符串转换成一系列字符串。我的问题是将字符串分解成不同的项目列表,这些项目可以是字符串也可以是整数。你知道吗


Tags: 项目方法字符串用户内容列表字母符号
3条回答

您可以使用^{}^{}和列表理解来获得所需的结果:

from itertools import groupby
text = "6 t3h10d6+6"
substrings = groupby(text, lambda c: (c.isdigit(), c.isspace()))
print([int(''.join(l)) if d else ''.join(l) for (d, s), l in substrings])
# => [6, ' ', 't', 3, 'h', 10, 'd', 6, '+', 6]

注意,'10'被解析为10,而不是'10'[1, 0]。你知道吗

也可以使用regex(通过指定查找所有数字和非数字字符):

>>> x
'6 t3h4df6d+!643'
>>> __import__("re").findall('\d+|\s+|\D+', x)
['6', ' ', 't', '3', 'h', '4', 'df', '6', 'd+!', '643']

如您所见,上面的表达式没有将d+!分开。 如果这是一个问题,你可以稍微修改上述规则 表达式到:

>>> x = '6 t3h4df6d+!643'
>>> re.findall('\d+|\s+|[a-zA-Z]+|\D+', x)
['6', ' ', 't', '3', 'h', '4', 'df', '6', 'd', '+!', '643']

把他们完全分开了!你知道吗

更新

如果要将字符串拆分为单个字符(例如"xy"拆分为['x','y']),可以将上述regex表达式更改为:

>>> x = '6 t3h4df6d+!643'
>>> __import__("re").findall('\d+|\s+|\w|\D+', x)
['6', ' ', 't', '3', 'h', '4', 'd', 'f', '6', 'd', '+!', '643']

如果您习惯使用列表理解List comprehensions

  [ int(c) if c.isdigit() else c for c in "6 t3h4d6+6" ]

输出

[6, ' ', 't', 3, 'h', 4, 'd', 6, '+', 6]

相关问题 更多 >