python正则表达之re.sub函数

1,030 阅读2分钟

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。
"""

示例

  1. 匹配汉字
    import re
    
    s = 'today,黄河之水天上来,hello world,奔流到海不复回'
    r = re.sub('[\u4e00-\u9fa5]', '*', s)
    print(r)
    
    >>> today,*******,hello world,*******
    
  2. 分组的妙用
    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
    
  3. 使用分组调整日期格式
    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
    
  4. 数字替换成中文
    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)
    
    >>> 二〇二二年〇九月一一日
    
  5. 剔除匹配的部分内容
    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