python正则表达之re.sub函数
在做网页爬虫或者数据清理时,经常需要对文本进行替换操作,一般会使用
string自带的replace函数进行简单的文本替换,但是遇到复杂的替换,使用replace函数可能很难实现。而re.sub是相对复杂点的替换,主要用于替换字符串中的匹配项,可以采用正则表达的方式进行匹配替换,替换形式更灵活。
re.sub函数参数含义
re.sub(pattern, repl, string, count=0, flags=0)
"""
:param pattern: 可以是一个字符串,也可以是一个正则,用于匹配要替换的字符,如果不写,字符串不做修改。\g<1> 代表前面pattern里面第一个分组,可以简写为\1,\g<0>代表前面pattern匹配到的所有字符串。
:param repl: 就是replacement,表示被替换的值,可以是字符串,也可以是函数。如果是一个字符串,反斜杠会被处理为逃逸字符,如\n会被替换为换行等;如果是一个函数,每一个被匹配到的字段串执行替换函数。
:param string: 表示要被处理和替换的原始字符串
:param count: 可选参数,表示是要替换的最大次数,而且必须是非负整数,该参数默认为0,即所有的匹配都会被替换;
:param flags: 可选参数,表示编译时用的匹配模式(如忽略大小写、多行模式等),数字形式,默认为0。
"""
示例
- 匹配汉字
import re s = 'today,黄河之水天上来,hello world,奔流到海不复回' r = re.sub('[\u4e00-\u9fa5]', '*', s) print(r) >>> today,*******,hello world,******* - 分组的妙用
import re s = 'hello sherry, nihao sherry' # \1代表第一个分组的值即sherry,因为有两个sherry,所以用\1可以指代第二个,这样整个字符串被emma替换 r = re.sub(r'hello (\w+), nihao \1', r'emma', s) print(r) >>> emma - 使用分组调整日期格式
import re s = '2022-09-11' r = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2-\3-\1', s) # r = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\g<2>-\g<3>-\g<1>', s) print(r) >>> 09-11-2022 - 数字替换成中文
import re def replace_num(text: str): num_dict = {'0': '〇', '1': '一', '2': '二', '3': '三', '4': '四', '5': '五', '6': '六', '7': '七', '8': '八', '9': '九'} return num_dict.get(text.group(), None) if __name__ == '__main__': s = '2022年09月11日' r = re.sub(r'(\d)', replace_num, s) print(r) >>> 二〇二二年〇九月一一日 - 剔除匹配的部分内容
import re s = '1x123-2c113-4x456' # 用匹配到的(\w+)替换匹配到的(\d+)(\w+),分组1为(\d+),简写\1,分组2为(\w+),简写\2 r = re.sub(r'(\d+)(\w+)', r'\2', s) print(r) >>> x123-c113-x456