Python进阶编程:编写更高效、优雅的Python代码
上QQ阅读APP看书,第一时间看更新

2.2.1 字符串分割

我们在工作中经常会遇到这样的问题:将一个分割符不固定的字符串分割为多个字段。

String对象中有一个split()方法,该方法只适用于非常简单的字符串分割情形,不允许有多个分隔符或者是分隔符周围有不确定的空格。当需要更加灵活地切割字符串时,最好使用re.split()函数,示例如下:


import re

line = 'hello world; life is short,use, python, best'
# 使用正则表达式做分割
print(re.split(r'[;,\s]\s*', line))

re.split()函数是非常实用的,它允许为分隔符指定多个正则模式。如在上述例子中,分隔符可以是逗号、分号或者是空格,并且后面紧跟着任意个空格。只要这个模式被找到,匹配的分隔符两边的实体都会被当成是结果中的元素返回。返回结果为一个字段列表,这与str.split()函数返回值类型是一样的。

当使用re.split()函数时,需要特别注意正则表达式中是否包含捕获型括号进行捕获分组。如果使用了捕获分组,那么被匹配的文本将出现在结果列表中。代码示例如下:


sub_line_list = re.split(r'(;|,|\s)\s*', line)
print(sub_line_list)

获取分割字符在某些情况下也是有用的。如果想保留分割字符串用于重新构造新的输出字符串,代码示例如下:


val_list = sub_line_list[::2]
print(val_list)
delimiters = sub_line_list[1::2] + ['']
print(delimiters)
print(' '.join(v+d for v,d in zip(val_list, delimiters)))

如果不想保留分割字符串到结果列表中,但仍然需要使用括号来分组正则表达式,以确保分组是非捕获分组,形如(?...),代码示例如下:


print(re.split(r'(?:,|;|\s)\s*', line))

扩展:正确判断空对象

字符串处理中,系统经常需要做空字符串的判断。在Python中,除了空字符串,还有如下数据会当作空来处理:

·常量None。

·常量False。

·任何形式的数值类型零,如0、0.0、0j。

·空的序列,如''、()、[]。

·空的字典,如{}。

我们遇到上述这些类型的对象时,需要注意空的处理,否则会出现意想不到的结果。