我试图解码一个看起来像这样的字符串" 2a3bc"进入" aabbbc"在Python中。因此,我需要做的第一件事就是将其拆分为一个包含有意义的组的列表。换句话说:['2a','3b','c']
。
基本上,匹配(1)数字和字母或(2)只是一个字母。
我有这个:
re.findall('\d+\S|\s', '2a3bc')
然后它返回:
['2a', '3b']
所以它实际上错过了c
。
也许我的正则表达式技能缺乏,任何帮助都会受到赞赏。
答案 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
只会匹配字母。