• python中常用的正则表达式以及使用方法?


    实际使用
    正则解决的是高效率使用字符串的问题,而字符串操作贯穿整个程序执行,其重要程度可见一斑。
    另外,爬虫对正则是强需求。

    re.findall和re.sub是最常用的,也是最易用的,至于re.match和re.search不知为何所有正则都要大篇幅介绍,但是用起来繁琐,比findall差远了,这里不列举。

    典型用例
    1 字符集——概括性的字符集使用
    d s w
    L = "python123php932-we2 w@3"
    # 1 字符集——概括字符集 s w d . 大写是互补
    a1 = re.findall(r"d",L) #d 表示数字[0-9]
    a2 = re.findall(r"D",L) #D 表示非数字
    a3 = re.findall(r"w",L) #w 表示数字和字母
    a4 = re.findall(r"W",L) #W 表示非数字和字母
    a5 = re.findall(r"s",L) #s 表示空格键
    a6 = re.findall(r"S",L) #S 表示匹配非空格键
    print(a1)#['1', '2', '3', '9', '3', '2', '2', '3']
    print(a2)#['p', 'y', 't', 'h', 'o', 'n', 'p', 'h', 'p', '-', 'w', 'e', ' ', 'w', '@']
    print(a3)#['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3', 'p', 'h', 'p', '9', '3', '2', 'w', 'e', '2', 'w', '3']
    print(a4)#['-', ' ', '@']
    print(a5)#[' ']
    print(a6)#['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3', 'p', 'h', 'p', '9', '3', '2', '-', 'w', 'e', '2', 'w', '@', '3']

    2 字符集——量词的使用
    基本量词
    L = "python123php932java278js w@3"
    a1 = re.findall("[a-z]{2,6}", L)# [a-z]表示需要匹配的字母范围;{2,6}表示量词,重复的次数范围
    print(a1)# ['python', 'php', 'java', 'js']

    其他量词:*?+
    L = "pytho3php2python3pythonnn328jsw@3"
    a1 = re.findall("python*", L)# *匹配前面字符0次或者无限多次
    a2 = re.findall("python+", L)# +匹配前面字符1次或者无限多次
    a3 = re.findall("python?", L)# ?匹配零次或者一次,可以去重
    print(a1)# ['pytho', 'python', 'pythonnn']
    print(a2)# ['python', 'pythonnn']
    print(a3)# ['pytho', 'python', 'python']

    3 字符集——贪婪和非贪婪
    从2的例子可以看出,当量词是{2,6}时,因为默认的贪婪搜索模式,所以即使符合最小值2时,查找依旧不停,继续查找至6.这就是所谓贪婪。在后面加个?可以变成非贪婪匹配。据说正则的坑大部分都在此。

    L = "python123php932java278js w@3"
    a1 = re.findall("[a-z]{2,6}", L)# [a-z]表示需要匹配的字母范围;{2,6}表示量词,重复的次数范围
    print(a1)# ['python', 'php', 'java', 'js']
    a2 = re.findall("[a-z]{2,6}?", L)
    print(a2)#['py', 'th', 'on', 'ph', 'ja', 'va', 'js']

    4 边界匹配:^$
    举例,想要匹配4-9位的qq号,如果单纯使用量词而不使用边界占位符进行匹配,很容易出现问题。

    qq = "1000154501"#10位的qq号,使用下面正则进行匹配

    a1 = re.findall("d{4,9}", qq)# 失败,因为竟然能匹配出来!
    print(a1)# ['100015450']
    a2 = re.findall("d{4,9$}", qq)
    print(a2)# []

    边界占位符,就是设定个靶点,$表示末尾,则^表示开头

    qq = "qq1000154501"
    a3 = re.findall("^d", qq)
    print(a3)# [],因为是从第一个字符匹配,如果失败则为空
    a4 = re.findall("d", qq)
    print(a4)# ['1', '0', '0', '0', '1', '5', '4', '5', '0', '1']

    5 re.sub的重大意义
    简单替换
    L = "A9849379541D11S"
    a1 = re.sub("A","flower", L)# 将字符串中的A替换为flower
    print(a1)# flower9849379541D11S

     
    需要根据不同条件替换不同字符串时,可以把函数当作参数传入进来
    L = "A698469379541D11S"
    def sub_test(value):

    tmp = int(value.group())
    if tmp > 7:
    return "9"
    else:
    return "0"

    a1 = re.sub(r"d",sub_test, L)# 将大于7的字符替换为9,小于7的替换为0
    print(a1)# A099009009000D00S


    原文链接:https://blog.csdn.net/yueshuw123/article/details/106841570

  • 相关阅读:
    SQL Server 2008 Windows身份验证改为混合模式身份验证
    SQL中给datetime类型变量赋值
    结婚三周年特此@Mark一下
    搞笑的【国庆出游五大注意事项】
    利用SVNListParentPath增加http浏览仓库根目录的功能
    如果年底买不到CC就出手小指吧
    svn备份策略
    缺乏配置管理造成的常见问题
    高速公路开车必看的注意事项
    山雨欲来踏上Java学习之路
  • 原文地址:https://www.cnblogs.com/LQZ888/p/13164004.html
Copyright © 2020-2023  润新知