Python中字符串分割的常用方法是直接调用字符串的 str.split 方法,但是其只能指定一种分隔符,如果想指定多个分隔符拆分字符串需要用到 re.split 方法(正则表达式的split方法)。
str.split
re.split
字符串的split方法函数原型如下,其中sep为指定的分隔符,maxsplit为最大分割次数:
1
str.split(sep=None, maxsplit=-1)
默认情况下,不指定分隔符时则以空白字符(空格,回车,制表符等)作为分隔符拆分字符串:
1234
>>> s = 'A B\tC\nD'>>> s.split()['A', 'B', 'C', 'D']>>>
在结果列表中,不会包含空字符串:
>>> s = ' A B\tC\nD\n\n'>>> s.split()['A', 'B', 'C', 'D']>>>
指定分隔符:
1234567
>>> s = 'www.google.com'>>> s.split('.')['www', 'google', 'com']>>> s = 'AA||BB||CC||DD'>>> s.split('||')['AA', 'BB', 'CC', 'DD']>>>
指定最大分割次数:
>>> s = 'www.google.com'>>> s.split('.', 1)['www', 'google.com']>>> s = 'AA||BB||CC||DD'>>> s.split('||', 2)['AA', 'BB', 'CC||DD']>>>
由此可见,当指定最大分割次数 maxsplit 时,结果列表长度为 maxsplit+1 。 但是,字符串的split方法只能指定一个分隔符,如下:
maxsplit
maxsplit+1
s = 'AAAA,BBBB:CCCC;DDDD'
如果想指定逗号、冒号、分号都做为分隔符,字符串的split方法是做不到的,此时要用正则表达式中的split方法。
正则表达式的split方法原型如下,其中pattern为指定的分隔正则表达式,string为要分割的字符串,maxsplit为最大分割次数,flags为正则表达式用到的通用标志:
re.split(pattern, string, maxsplit=0, flags=0)
参考示例:
12345
>>> import re>>> s = 'AAAA,BBBB:CCCC;DDDD'>>> re.split(r'[,:;]', s)['AAAA', 'BBBB', 'CCCC', 'DDDD']>>>
如果在正则表达式里使用了捕获组也就是括号,则结果列表中也会包含捕获的内容:
>>> import re>>> s = 'AAAA,BBBB:CCCC;DDDD'>>> re.split(r'([,:;])', s)['AAAA', ',', 'BBBB', ':', 'CCCC', ';', 'DDDD']>>>
如果不想在结果中看到分隔符,但仍然想用括号对正则表达式模式进行分组,可以使用非捕获组,以 (?:...) 的形式指定,示例如下:
(?:...)
>>> import re>>> s = 'AAAA,BBBB:CCCC;DDDD'>>> re.split(r'(?:[,:;])', s)['AAAA', 'BBBB', 'CCCC', 'DDDD']>>>
>>> import re>>> s = 'AAAA,BBBB:CCCC;DDDD'>>> re.split(r'[,:;]', s, 1)['AAAA', 'BBBB:CCCC;DDDD']>>> re.split(r'[,:;]', s, 2)['AAAA', 'BBBB', 'CCCC;DDDD']>>>
由此可见,当指定最大分割次数 maxsplit 时,结果列表长度为 maxsplit+1 。 指定正则表达式中的通用标志flags:
>>> import re>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)['0', '3', '9']>>>