2010-06-02 21 views
1

我想將Python字符串分解爲其字符。將Python字符串分解爲其字符

sequenceOfAlphabets = list(string.uppercase) 

的作品。

但是,爲什麼不

sequenceOfAlphabets = re.split('.', string.uppercase) 

工作?

我得到的都是空的,儘管元素

+8

爲什麼如果使用'list'進行簡單的轉換就可以使用正則表達式呢? – SilentGhost 2010-06-02 11:44:19

+0

對於那些當獲得的理解來使用。 由於這個問題出現了 - 我們有更快的數字和*多少*? – PoorLuzer 2010-06-02 14:30:14

回答

4

'.'匹配每個字符並且re.split返回所有不匹配的東西,這就是爲什麼您會得到空列表。

使用list通常要處理這樣的事情的方式,但如果你想使用正則表達式只使用re.findall

sequenceOfAlphabets = re.findall('.', string.uppercase) 

這應該給你['A', 'B', 'C', .... ,'Z']

+0

一個非常精確和寫得很好的答案約翰。保持! – PoorLuzer 2010-06-02 14:28:47

+0

-1不準確,錯誤。看到我的答案。 – 2010-06-03 05:41:09

+0

如果我們有興趣提取嵌入的換行符,則這是錯誤的*。除此之外,它仍*精確! – PoorLuzer 2010-06-03 11:22:11

2

因爲通過拆分使用的分隔符不會出現在結果列表中的預計數。這使得它可以像使用:

re.split(',', "foo,bar,baz") 
['foo', 'bar', 'baz'] 

而且,你會發現從你的分裂代碼生成的列表中實際上包含了一個額外的元素,因爲分返回除發現分隔符的數量多一個。上面有兩個逗號,所以它返回一個三元素列表。

-1

從文檔:

如果捕獲括號在 模式中使用,然後在圖案各組 的文本也返回結果列表的 一部分。

還要注意:

如果有在 分離器捕獲組,它在字符串的開頭 匹配,結果將開始 一個空字符串。對於字符串的末尾,同樣保留 。

因此,改用re.split('(.)', string.uppercase)[1:-1]

+0

這仍然給不必要的空字符。 – 2010-06-02 11:43:03

+0

我在回覆中提到了相關文檔。它一貫如此,所以它們很容易拆卸。也就是說,僅僅使用're.split('(。)',string.uppercase)[1:-1]'來擺脫它們就夠簡單了。更新我的答案。 – Brian 2010-06-02 12:04:47

0

只是一個供參考,這也適用:

sequenceOfAlphabets = [a for a in string.uppercase] 

...但是,這確實是什麼list()會這樣做,我不認爲這將是任何快速呃(我可能是錯的)。

1

如果你可以用內置函數和正則表達式做某些事情,那麼內置的方法通常會更快,更清晰。

正則表達式世界是一個曲折的小段落迷宮,由幾乎真理的承辦人填充,如「」「The'。匹配每個字符「」「......它所做的,但只有當你使用re.DOTALL標誌。這些信息並不狡猾地隱藏在文檔的細節中;它就在那裏作爲「特殊字符」的第一個輸入:

'。'
(Dot。)在默認模式下,它匹配除換行符以外的任何字符。如果已經指定了DOTALL標誌,則它匹配包括換行符的任何字符。

>>> import re 
>>> re.findall(".", "fu\nbar") 
['f', 'u', 'b', 'a', 'r'] 
>>> 
+0

你對約翰的答案是不正確的,因爲它不會返回'\ n'嗎?在那種情況下,你會說得對,雖然是迂腐的,因爲我的意圖*是爲了獲得字母的運行,但從來沒有把它寫成文字。 – PoorLuzer 2010-06-03 11:18:06

+0

(1)說「匹配每個字符」不同於「匹配除換行符之外的任何字符」是迂迴的? (2)我猜根據谷歌搜索「字母表」是「字母」是香港英語的「字母字符」,但什麼是「*字母運行」? '\ n'是「字母」還是「非字母」? – 2010-06-03 22:48:02