Python正则表达式模块中函数sub的参数详解及高级用法

文章目录

  • 1. repl接受函数作为参数
  • 2. 空匹配的概念
  • 3. sub函数综合使用案例

在文章Python爬虫、后端,使用正则表达式,看这一篇就够了!中,我们学习了Python正则表达式模块re中的数个常用函数,且简单学习了re.sub(pattern, repl, string, count=0, flags=0) 函数的使用。

实际上,通过给该函数传入不同参数,可以实现更为高级的用法:

1. repl接受函数作为参数

实际上,对于sub函数,当repl参数为函数时:

  • 该函数在pattern每匹配string成功一次时被调用;
  • 该函数仅接受一个match object(关于该对象及其常用方法,请见文章Python爬虫、后端,使用正则表达式,看这一篇就够了!)作为参数;
  • 该函数返回被替换后的字符串。

观察下列代码的运行情况:

import re


def add(match_obj):
    if match_obj:
        str_match_num = match_obj.group()
        num = int(str_match_num) + 1
        return str(num)


def dash_repl(match_obj):
    if match_obj:
        if match_obj.group(0) == "-":
            return " "
        else:
            return "-"


def main():
    ret = re.sub(r"\d+", add, "Python = 997")
    print(ret)

    ret = re.sub(r"\d+", add, "Python = 99")
    print(ret)

    ret = re.sub("-{1,2}", dash_repl, "pro-----gram-files")
    print(ret)

    ret = re.subn("-{1,2}", dash_repl, "pro----gram-files")
    print(ret)


if __name__ == '__main__':
    main()

上述代码的运行结果为:

Python = 998
Python = 100
pro-- gram files
(‘pro–gram files’, 3)

代码及运行结果分析:

  • 关于非重叠(non-overlapping)概念:
    • 上述使用sub函数时,待替换字符串为"pro-----gram-files",由于替换规则为-{1,2},则为避免匹配时产生歧义,该规则会按照2个"-"、2个"-"、1个"-“的确定方式分隔”-----"。
  • 关于函数re.subn(pattern, repl, string, count=0, flags=0):
    • 该函数实现的功能和sub函数类似,区别仅在于返回值不同,即:subn函数除了返回被替换后的新字符串,还会返回替换发生的次数,也就是说,subn函数的返回值为一个元组(new_string, number_of_subs_made)。

2. 空匹配的概念

对于函数sub,参数count可选,且:

  • 该参数用于指定最大的匹配替换次数,必须为非负整数;
  • 该参数如果省略或指定为0,则所有得到的匹配都将被替换;
  • 当出现空匹配时,该函数只会将不相邻的空匹配进行替换。

使用文章Python爬虫、后端,使用正则表达式,看这一篇就够了!
中学习的findall函数,分析这样一个正则表达式实现的匹配:re.findall(r"x*", “abxd”),其输出实际上为[’’, ‘’, ‘x’, ‘’, ‘’],即该正则匹配出了四个字符串,其中有三个都是所谓的空匹配

3. sub函数综合使用案例

假设有这样的一项需求,将下列一段摘自网页的HTML文本中的所有标签、空格等全部替换,仅留下文字:


岗位职责:


1、负责公司业务群的SDL安全规划,并提出安全需求标准;


2、负责各类系统的安全评审,并与其他团队一起改进研发安全质量;


3、推动安全测试自动化平台的建设,比如自动化安全测试平台


4、参与SDL的安全开发指南、安全编码规范等制定、评审和推动落地。


任职要求:


1、3年以上相关安全经验,评审经验(web和移动APP方向均可)(有互联网公司SDL规划工作经验者优先);


2、精通常见应用系统的代码漏洞测试和验证,并能指导开发人员进行修复;


3、熟悉常见业务逻辑漏洞的测试和验证,并能指导开发人员进行修复(熟悉大型web系统架构者优先);


4、熟悉安全代码测试流程和方法,并能熟练运用各种代码测试工具;


5、对业界安全动态保持较高的敏感度,能**时间获取到漏洞信息并对公司相关系统进行对应的响应处理;


6、熟练掌握一门开发语言(如Java、Python、C++等);


7、快速的学习能力、良好的沟通能力和团队协作能力。


此岗位为科大讯飞集团统一招聘岗位,人员通过简历筛选、笔试、初试、复试、终审等环节后录用


为实现上述需求,可以使用正则表达式:re.sub(r"<[^>]+>| | |\n", “”, str),其中str为上述待处理字符串。

运行后可得:

‘岗位职责:1、负责公司业务群的SDL安全规划,并提出安全需求标准;2、负责各类系统的安全评审,并与其他团队一起改进研发安全质量;3、推动安全测试自动化平台的建设,比如自动化安全测试平台4、参与SDL的安全开发指南、安全编码规范等制定、评审和推动落地。任职要求:1、3年以上相关安全经验,评审经验(web和移动APP方向均可)(有互联网公司SDL规划工作经验者优先);2、精通常见应用系统的代码漏洞测试和验证,并能指导开发人员进行修复;3、熟悉常见业务逻辑漏洞的测试和验证,并能指导开发人员进行修复(熟悉大型web系统架构者优先);4、熟悉安全代码测试流程和方法,并能熟练运用各种代码测试工具;5、对业界安全动态保持较高的敏感度,能**时间获取到漏洞信息并对公司相关系统进行对应的响应处理;6、熟练掌握一门开发语言(如Java、Python、C++等);7、快速的学习能力、良好的沟通能力和团队协作能力。此岗位为科大讯飞集团统一招聘岗位,人员通过简历筛选、笔试、初试、复试、终审等环节后录用’

要想理解上述正则表达式<[^>]+>| | |\n的含义,需求先明确实现上述需求的思路,即上述原始字符串中,待替换为空的字符包括HTML开始标签<标签名>、结束标签、空格、换行。

于是<[^>]+>(此处^表示取反之意)可用于匹配出所有的HTML标签, 可匹配出所有的空格,\n可匹配出所有的换行,而|用于以的方式连接前面三个规则。

你可能感兴趣的:(#,正则表达式)