将字符串拆分为数字和字母或单个字母的组

时间:2017-03-29 01:40:48

标签: python regex string

我试图解码一个看起来像这样的字符串" 2a3bc"进入" aabbbc"在Python中。因此,我需要做的第一件事就是将其拆分为一个包含有意义的组的列表。换句话说:['2a','3b','c']

基本上,匹配(1)数字和字母或(2)只是一个字母。

我有这个:

re.findall('\d+\S|\s', '2a3bc')

然后它返回:

['2a', '3b']

所以它实际上错过了c

也许我的正则表达式技能缺乏,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:5)

您当前的表达式可以使用一个小错误修正:\S是非空格,而\s是空格。在这两种情况下,您都在寻找非空白,因此您不应该在任何地方使用\s

>>> re.findall(r'\d+\S|\S', '2a3bc')
['2a', '3b', 'c']

但是,此表达式可能会更短:不要将+用于一个或多个数字,而是将*用于零或更多,因为该组可能不会以任何数字开头,并且您可以然后摆脱交替。

>>> re.findall(r'\d*\S', '2a3bc')
['2a', '3b', 'c']

但是,请注意\S只是非空白 - 包括字母,数字甚至标点符号。 \D,非数字,有类似的问题:它排除数字,但包括标点符号。然后,最短,最清晰的正则表达式将\S替换为\w,表示字母数字字符:

>>> re.findall(r'\d*\w', '2a3bc')
['2a', '3b', 'c']

由于组中的其他字符类已经是数字,因此此特定\w只会匹配字母。