• 正则表达式


    Python通过re模块实现对正则表达式的支持

    匹配操作

    re.match(pattern, string)从字符串的开始进行匹配,如果开始部分匹配成功就返回陪陪对象,否则返回None

    1. import re
    2. m = re.match('foo', 'food') # 返回匹配对象
    3. print(m) #
    4. m = re.match('foo', 'fbar')
    5. print(m) # None
    搜索操作

    re.search(pattern, string)扫描字符串,如果找到匹配就返回匹配对象,否则返回None

    1. m = re.search('foo', 'hellofood')
    2. print(m) #
    3. m = re.search('foo', 'hello')
    4. print(m) # None
    提取操作

    re.findall(pattern, string)查找所有匹配,返回所有匹配结果的列表,没有匹配到就返回空列表

    1. lst = re.findall('ab', 'abcdabcdabcd')
    2. print(lst) # ['ab', 'ab', 'ab']

    re.finditer(pattern, string)查找所有匹配,返回所有匹配结果的一个iterator

    1. lst = re.finditer('ab', 'abcdabcdabcd')
    2. print(lst) #
    3. for i in lst:
    4. print(f"{i} {i.group()}")
    5. """
    6. ab
    7. ab
    8. ab
    9. """
    替换操作

    re.sub(pattern, string)用于替换匹配的字符串

    1. text = "I am the bone of my sword"
    2. print(re.sub('sword', 'blade', text))
    3. # I am the bone of my blade
    匹配字符
    字符功能
    .匹配任意1个字符(除了\n)
    []匹配[]中列举的字符
    \d匹配数字,即0-9
    \D匹配非数字
    \s匹配空白,即空格,tab键
    \S匹配非空白
    \w匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
    \W匹配特殊字符,即非字母、非数字、非汉字
    匹配多个字符
    字符功能
    *匹配前一个字符0次或者无限次,即可有可无
    +匹配前一个字符出现1次或者无限次,即至少1次
    匹配前一个字符出现1次或者0次,即要么1次,要么没有
    {m}匹配前一个字符出现m次
    {m,n}

    匹配前一个字符出现从m到n次

    *示例
    1. import re
    2. ret = re.match("[A-Z][a-z]*", "M")
    3. print(ret.group()) # M
    4. ret = re.match("[A-Z][a-z]*", "MnnM")
    5. print(ret.group()) # Mnn
    6. ret = re.match("[A-Z][a-z]*", "AabbccCdd")
    7. print(ret.group()) # Aabbcc
    +示例
    1. match_obj = re.match("py.+n", "python")
    2. if match_obj:
    3. print(match_obj.group())
    4. else:
    5. print("匹配失败")
    6. # python
    ?示例
    1. match_obj = re.match("https?", "http")
    2. if match_obj:
    3. print(match_obj.group())
    4. else:
    5. print("匹配失败")
    6. # http
    {m}、{m,n}示例
    1. ret = re.match("[a-zA-Z0-9_]{6}","12a3G345H")
    2. print(ret.group()) # 12a3G3
    3. ret = re.match("[a-zA-Z0-9_]{8,20}","1a2b3c4d5e6f7g8h9ijklmn")
    4. print(ret.group()) # 1a2b3c4d5e6f7g8h9ijk
    贪婪模式与非贪婪模式

    正则表达式中,贪婪模式和非贪婪模式描述的是量词的匹配方式。

    量词是正则表达式中指定匹配次数的元字符,主要有:

    *:0次或多次

    ?:0次或1次

    +:1次或多次

    贪婪模式:两次会尽可能多的匹配字符

    非贪婪模式:两次会尽可能少的匹配字符

    在正则表达式中,贪婪模式是默认的,可以通过在量词后面加?将其转换为非贪婪模式

    1. import re
    2. # 贪婪模式
    3. ret = re.match("
      .+
      "
      , "
      111
      222
      "
      )
    4. print(ret.group()) #
      111
      222
    5. # 非贪婪模式
    6. ret = re.match("
      .+?
      "
      , "
      111
      222
      "
      )
    7. print(ret.group()) #
      111
    匹配开头和结尾

    ^:匹配字符串开头

    1. import re
    2. # 匹配以数字开头的数据
    3. match_obj = re.match("^\d.*", "6hello")
    4. if match_obj:
    5. print(match_obj.group())
    6. else:
    7. print("匹配失败")

    $:匹配字符串结尾

    1. # 匹配以数字结尾的数据
    2. match_obj = re.match(".*\d$", "saber1")
    3. if match_obj:
    4. print(match_obj.group())
    5. else:
    6. print("匹配失败")

    [^指定字符]:匹配指定字符以外的所有字符

    1. match_obj = re.match("[^abc]", "d")
    2. if match_obj:
    3. print(match_obj.group())
    4. else:
    5. print("匹配失败")
    匹配分组
    字符功能
    |匹配左右任意一个表达式
    (ab)将括号中的字符作为一个分组
    \num引用分组num匹配到的字符串
    (?P)分组起别名
    (?P=name)引用别名为name的分组匹配到的字符串
    1. import re
    2. lst = ["archer", "saber", "lancer", "rider"]
    3. for value in lst:
    4. match_obj = re.match("saber|archer", value)
    5. if match_obj:
    6. print(f"{match_obj.group()} nice!")
    7. else:
    8. print(value)
    1. # 匹配邮箱
    2. match_obj = re.match("\w{4,20}@(163|126|qq)\.com", "archer@qq.com")
    3. if match_obj:
    4. print(match_obj.group())
    5. else:
    6. print("匹配失败")
    1. # 匹配 电话:10086 类似的数据,提取"电话"文字和号码
    2. match_obj = re.match("(电话):([1-9]\d{4,10})", "电话:10086")
    3. if match_obj:
    4. print(match_obj.group())
    5. # 分组:默认是1一个分组,多个分组从左到右依次加1
    6. print(match_obj.group(1))
    7. # 提取第二个分组数据
    8. print(match_obj.group(2))
    9. else:
    10. print("匹配失败")
    11. # 电话
    12. # 10086
    1. match_obj = re.match("<[a-zA-Z1-6]+>.*", "abc
      ")
  • if match_obj:
  • print(match_obj.group())
  • else:
  • print("匹配失败")
  • match_obj = re.match("<([a-zA-Z1-6]+)>.*", "abc")
  • if match_obj:
  • print(match_obj.group())
  • else:
  • print("匹配失败")
  • # abc
  • # abc
    1. match_obj = re.match("<(?P[a-zA-Z1-6]+)><(?P[a-zA-Z1-6]+)>.*",
    2. "

      www.baidu.com

      "
      )
    3. if match_obj:
    4. print(match_obj.group())
    5. else:
    6. print("匹配失败")
    正则中标志的使用
    字符功能
    re.I (IGNORECASE)忽略大小写
    re.M (MULTILINE)多行匹配,修改'^'和'$'的行为
    re.S (DOTALL).可以匹配所有字符,包含换行符
    re.U (UNICODE)使用Unicode匹配
    re.X (VERBOSE)忽略空格和注释,使正则表达式更具有可读性
    1. import re
    2. # 忽略大小写
    3. m1 = re.match('[a-z]+','Hello', re.I)
    4. if m1:
    5. print(m1.group())
    6. else:
    7. print('m1:匹配失败')
    8. # .可以匹配所有字符,包含换行符
    9. m2 = re.match('.+', "Hello\n\tWorld", re.S)
    10. if m2:
    11. print(m2.group())
    12. else:
    13. print('m2:匹配失败')
    14. # 忽略空格和注释,使正则表达式更具有可读性
    15. m3 = re.match(r"""
    16. ^
    17. (
    18. [a-z]+[A-Z]*
    19. |
    20. [A-Z]+[a-z]*
    21. )
    22. \s+
    23. (World)
    24. ""","Hello World", re.X)
    25. print(m3.group())
    26. # Hello
    27. # Hello
    28. # World
    29. # Hello World

  • 相关阅读:
    docker & k8s
    电脑提示MSVCP100.dll丢失错误怎么解决?分享四个解决方法帮你搞定
    Redux入门:使用@reduxjs/toolkit构建React应用程序状态管理
    深度可分离卷积神经网络与卷积神经网络
    关于为了少搬砖,而用node手写了一个React脚手架这件事
    计算机基础 码制与位运算
    灵性图书馆:好书推荐-《地球编年史第一部》
    Redis从入门到放弃(5):事务
    ue4打包出现问题解决[Callstack] 0x00007ffa47e6474c KERNELBASE.dll!UnknownFunction []
    30分钟带你熟练性能优化的那点儿事儿(案例说明)
  • 原文地址:https://blog.csdn.net/qq_42797317/article/details/139597590