上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。
·空的序列,如''、()、[]。
·空的字典,如{}。
我们遇到上述这些类型的对象时,需要注意空的处理,否则会出现意想不到的结果。