2017-09-04 82 views
1

比方說,有一個可以是一個字符串:從字符串添加不同的項目列表

  • 「3D6」
  • 「t3d6」
  • 「3h4d6」
  • 「t3h4d6」
  • 「6 t3d6」
  • 「6 t3h4d6 + 6」以及類似的可能變化。

有沒有一種方法來運行字符串,並將其中的項目添加到基於它們的字母/數字/符號/其他的東西?例如,"6 t3h10d6+6"將導致[6, " ", "t", 3, "h", 10, "d", 6, "+", 6]作爲列表。

我正在使用python通過骰子計算結果來回答用戶的輸入,最難的部分是處理用戶輸入的電報機器人。現在輸入正在通過笨拙的if語句複雜處理。可能有更好的方法來處理用戶輸入,我很樂意聽到你的建議!

this question不重複。問題是關於將字符串分解成字符列表,基本上將字符串轉換爲字符串列表。我的問題是關於將字符串拆分成可以是字符串和整數的不同項目的列表。

+0

[將字符串拆分爲Python中的字符列表](https:// stackoverflow。com/questions/9833392 /打破字符串到python列表) – samiles

回答

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

非常非常pythonic –

+0

@安迪K耶普,thx :) – coder

+1

和你教我一個新的東西。我甚至沒有意識到... omg ...'__import __(「re」)。findall(正則表達式,變量)'OMG!哇, –

1

如果您習慣使用列表理解List comprehensions

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

輸出

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

請注意,這不會從'「6 t3h10d6 + 6」' –

1

你可以使用groupbyisdigit和list解析,以達到預期的效果:

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]

+0

提取'10'我也可以注意到''t「'被解析爲'」t「'而不是''」「,」t 「]'。足夠近! –

+0

@AntonyPetrushko:確實。應該如何解析'「ab」? –

+0

好的觀察!抱歉,不要在問題中提供最佳示例。 ''「ab」應該被解析爲'[「a」,「b」]和'「b」'作爲'[「」,「b」]'。基本上它應該把一個字符串變成一個數字列表(不是數字)和單個字符。 –

相關問題