Python字符串分割

7
我有一个输入字符串,如下:a1b2c30d40,我希望将它分解为:a, 1, b, 2, c, 30, d, 40
我知道我可以逐个字符地读取,并跟踪前一个字符以确定是否应该对其进行标记化(两个数字连续在一起意味着不要对其进行标记化),但是有没有更符合Python语言特性的方法呢?
1个回答

13
>>> re.split(r'(\d+)', 'a1b2c30d40')
['a', '1', 'b', '2', 'c', '30', 'd', '40', '']

关于这个模式:正如注释所说,\d 表示“匹配一个数字”,+ 是一个修饰符,表示“匹配一个或多个”,因此 \d+ 表示“尽可能匹配多的数字”。整个模式被放入了一个组 () 中,在 re.split 的上下文中,意思是“使用尽可能多的数字作为分隔符来拆分该字符串,并将匹配到的分隔符捕获到结果中”。如果省略了这个组,你会得到['a', 'b', 'c', 'd', '']


我不太理解正则表达式。你介意解释一下 (\d+) 模式吗? - Hery
1
它会根据数字/连续数字进行分割(\d代表0-9,+代表一个或多个)。 - user395760
2
+1:但我认为最好使用原始字符串来处理正则表达式。 - 6502
@6502:只有在模式中存在任何Python解释的转义字符(例如\n\t)时才会有影响(以避免在其中转义\\)。 - Cat Plus Plus
4
@Piotr: 我知道……但我认为如果使用原始字符串,你的答案会更具指导性,有两个原因:1)就我的经验而言,如果转义代码无效,Python将保留反斜杠在字符串中的事实常常令人惊讶:open("c:\zer\woob.dat")可以工作,但open("c:\temp\buf.dat")却不行。2)比\t和\n更多特殊字符存在,特别是\b是其中之一,而r'\b'则是正则表达式中的特殊字符。通过使用那个花式的r'(\d+)',读者可能会花时间阅读有关转义问题的内容...... - 6502
@Piotr:在正则表达式中,你完全可以始终使用原始字符串。 - John Machin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接