从字符串

时间:2017-09-04 14:04:31

标签: python list

让我们说,有一个字符串可以是:

  • " 3D6"
  • " t3d6"
  • " 3h4d6"
  • " t3h4d6"
  • " 6 t3d6"
  • " 6 t3h4d6 + 6"和类似的可能变化。

有没有办法在字符串中运行并根据字母/数字/符号/其他内容将项目添加到列表中?例如,"6 t3h10d6+6"会导致[6, " ", "t", 3, "h", 10, "d", 6, "+", 6]作为列表。

我正在研究使用python回答用户的电报机器人'输入骰子计算结果,最难的部分是处理用户输入。现在,输入正在通过笨拙的if语句复杂处理。可能有更好的方法来处理用户输入,我很乐意听取您的建议!

this question不重复。问题是将字符串分成字符列表,基本上将字符串转换为字符串列表。我的问题是将字符串分成不同的项目列表,可以是字符串和整数。

3 个答案:

答案 0 :(得分:2)

您也可以使用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']

答案 1 :(得分:1)

如果您习惯使用列表推导List comprehensions

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

输出

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

答案 2 :(得分:1)

您可以使用groupbyisdigit和列表推导来达到预期效果:

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]