2010-06-02 24 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