• 正则表达式基本概念及常用匹配模式代码


    一、正则表达式

    正则表达式:是记录文本规则的代码,用来匹配或查找符合某些规则的字符串数据

    特点:可读性差,通用性强,能适用于很多编程语言

    re模块的使用

    1. import re:导包
    2. result = re.match(正则表达式,要匹配的字符串):使用该方法进行匹配操作
    3. result.group():用来提取匹配到的数据
    1. import re
    2. print('-------------简单使用-------------')
    3. # result = re.match('hello', 'Hello135helloHELLO hehehellohell')
    4. result = re.search('hello', 'Hello135helloHELLO hehehellohell')
    5. data = result.group()
    6. print(data)
    7. 输出:
    8. -------------简单使用-------------
    9. hello

    二、匹配单个字符

    模式代码功能描述
    .匹配除换行符(\n)外的任意一个字符
    [ ]匹配[ ]中列举的字符
    [^指定字符]匹配[ ]中除指定字符外的字符

    \d

    匹配任意数字,等价于[0-9]
    \D匹配任意非数字
    \s匹配任意空白字符,等价于[\n\r\t\f]
    \S匹配任意非空白字符
    \w匹配任意非特殊字符,即数字、字母、下划线、汉字
    \W匹配任意特殊字符,即非数字、字母、下划线、汉字

     举例如下

    1. print('--------------------匹配单个字符--------------------')
    2. print('.匹配任意一个字符:', re.match('.', 'helloChina').group(), re.match('i.you', 'i&you').group()) # 输出:h i&you
    3. print(re.match('i.you', 'i爱you'), '||', re.match('i.you', 'i爱you').group()) # || i爱you
    4. print('[hi]匹配以字母h或i开头的字符:', re.match('[hi]', 'helloChina').group(), re.match('[hi]', 'i&you').group()) # h i
    5. print('[^hi]匹配不是以字母h或i开头的字符:', re.match('[^hi]', 'elloChina').group(), re.match('[^hi]', '&you').group()) # e &
    6. print(re.match('[0-9]hello', '2helloChina').group(), re.match('[0-9]i&you', '3i&you').group()) # 2hello 3i&you
    7. print('[0-35-9]hello匹配0-3和5-9之间的一个数字:', re.match('[0-35-9]hello', '4hello')) # 输出None,加上.group()后报错,匹配0-3或5-9之间的数字,不包含4
    8. print('\\d匹配任意数字:', re.match('第\\d天', '第2天了').group(), re.match('第\\d天', '第5天了').group()) # 第2天 第5天
    9. print('\\D匹配任意非数字:', re.match('第\\D天', '第二天了').group(), re.match('第\\D天', '第n天了').group()) # 第二天 第n天
    10. print('\\s匹配任意空白字符:', re.match('Hello\\sChina!', 'Hello China!').group(), re.match('Hello\\sChina!', 'Hello\tChina!').group()) # Hello China! Hello China!
    11. print('\\S匹配任意非空白字符:', re.match('Hello\\SChina!', 'Hello*China!').group(), re.match('Hello\\SChina!', 'Hello啊China!').group()) # Hello*China! Hello啊China!
    12. print('\\w匹配任意非特殊字符:', re.match('Hello\\wChina!', 'Hello_China!').group(), re.match('Hello\\wChina!', 'Hello啊China!').group()) # Hello_China! Hello啊China!
    13. print('\\W匹配任意特殊字符:', re.match('Hello\\WChina!', 'Hello%China!').group(), re.match('Hello\\WChina!', 'Hello!China!').group()) # Hello%China! Hello!China!
    14. 输出:
    15. --------------------匹配单个字符--------------------
    16. .匹配任意一个字符: h i&you
    17. object; span=(0, 5), match='i爱you'> || i爱you
    18. [hi]匹配以字母h或i开头的字符: h i
    19. [^hi]匹配不是以字母h或i开头的字符: e &
    20. 2hello 3i&you
    21. [0-35-9]hello匹配0-35-9之间的一个数字: None
    22. \d匹配任意数字: 第2天 第5
    23. \D匹配任意非数字: 第二天 第n天
    24. \s匹配任意空白字符: Hello China! Hello China!
    25. \S匹配任意非空白字符: Hello*China! Hello啊China!
    26. \w匹配任意非特殊字符: Hello_China! Hello啊China!
    27. \W匹配任意特殊字符: Hello%China! Hello!China!

    三、匹配多个字符

    模式代码功能描述
    *匹配其前一个字符任意次
    +匹配其前一个字符 ≥1 次
    匹配其前一个字符0或1次
    {m}匹配其前一个字符m次
    {m,n}匹配其前一个字符m~n次

    举例如下

    1. print('-----------------------------匹配多个字符------------------------------')
    2. print('[0-9]\\w*匹配第一个字符为数字,后面任意多个为非特殊字符:', re.match('Hello[0-9]\\w*China!', 'Hello123HElo_中国China!').group())
    3. print('\\S*匹配任意多个非空白字符:', re.match('Hello\\S*China!', 'Hello*he&L+LO_你好!China!').group())
    4. print('[0-9]\\w+匹配第一个字符为数字,后面 ≥1 个非特殊字符:', re.match('Hello[0-9]\\w+China!', 'Hello123HElo_中国China!').group())
    5. print('\\S+匹配 ≥1 个非空白字符:', re.match('Hello\\S+China!', 'Hello*he&L+LO_你好!China!').group())
    6. print('[0-9]\\w?匹配第一个字符为数字,后面 0或1 个非特殊字符:', re.match('Hello[0-9]\\w?China!', 'Hello1China!').group())
    7. print('\\S?匹配 0或1 个非空白字符:', re.match('Hello\\S?China!', 'Hello!China!').group())
    8. print('[a-z0-9]\\w{0,10}匹配第一个字符为小写字母或数字,后面 0~10 个非特殊字符:', re.match('Hello[a-z0-9]\\w{0,10}China!', 'HellooHELLo_China!').group())
    9. print('\\S{0,10}匹配 0~10 个非空白字符:', re.match('Hello\\S{0,10}China!', 'Hello!你好*China!').group())
    10. 输出:
    11. -----------------------------匹配多个字符------------------------------
    12. [0-9]\w*匹配第一个字符为数字,后面任意多个为非特殊字符: Hello123HElo_中国China!
    13. \S*匹配任意多个非空白字符: Hello*he&L+LO_你好!China!
    14. [0-9]\w+匹配第一个字符为数字,后面 ≥1 个非特殊字符: Hello123HElo_中国China!
    15. \S+匹配 ≥1 个非空白字符: Hello*he&L+LO_你好!China!
    16. [0-9]\w?匹配第一个字符为数字,后面 01 个非特殊字符: Hello1China!
    17. \S?匹配 01 个非空白字符: Hello!China!
    18. [a-z0-9]\w{0,10}匹配第一个字符为小写字母或数字,后面 0~10 个非特殊字符: HellooHELLo_China!
    19. \S{0,10}匹配 0~10 个非空白字符: Hello!你好*China!

    四、匹配开头和结尾

    模式代码功能描述
    ^匹配字符串开头
    $匹配字符串结尾

     举例如下

    1. print('------------------------------匹配字符串开头与结尾--------------------------')
    2. print('^\\S{0,10}匹配 0~10 个以非空白字符开头的字符:', re.match('^\\S{0,10}China!', 'Hello!你好*China!').group())
    3. print('.*\\d$匹配以数字结尾的字符,其前含任意多个字符:', re.match('China!.*\\d$', 'China!Hello!你好_520').group())
    4. print('^\\D.*China!.*\\d$匹配以任意非数字字符开头,其后可含任意多个任意字符,以数字结尾的字符,其前可含任意多个字符任意字符:', re.match('^\\D.*China!.*\\d$', '你好Hello_520!China!Hello!你好_520').group())
    5. print('[^helo]匹配不是以h、e、l、o字符开头的任意字符字符:', re.match('[^helo].*China!', '你好——Hello!你好*China!').group())
    6. 输出:
    7. ------------------------------匹配字符串开头与结尾--------------------------
    8. ^\S{0,10}匹配 0~10 个以非空白字符开头的字符: Hello!你好*China!
    9. .*\d$匹配以数字结尾的字符,其前含任意多个字符: China!Hello!你好_520
    10. ^\D.*China!.*\d$匹配以任意非数字字符开头,其后可含任意多个任意字符,以数字结尾的字符,其前可含任意多个字符任意字符: 你好Hello_520!China!Hello!你好_520
    11. [^helo]匹配不是以h、e、l、o字符开头的任意字符字符: 你好——Hello!你好*China!

    五、匹配分组

    模式代码功能描述
    |匹配左右任意一个表达式,如a|b表示匹配a或b
    (表达式)匹配括号内的表达式,将括号中表达式作为一个分组
    \i引用第i个分组匹配到的字符串
    (?P)分组起别名,写在分组括号()内
    (?P=name)引用别名为name分组匹配到的字符串

     举例如下

    1. print('-------------------------匹配分组----------------------------')
    2. list = ['Chinese', 'math', 'English', 'physical', 'history']
    3. for v in list:
    4. match_boject = re.match('Chinese|math|history', v)
    5. if match_boject:
    6. print('我喜欢%s' % match_boject.group())
    7. else:
    8. print('我讨厌%s' % v)
    9. print('------------------------(字符)分组--一个()即为一个分组------------------------')
    10. # 想要提取哪一部分数据,就可使用分组括起来,通过group(i)来获取,i即表示第i个分组
    11. match_object = re.match('[_0-9a-zA-Z]{5,10}@(qq|163|sina|gmail)\.(com)', 'Hello_520@qq.com') # \.表示转义,只能匹配点.字符
    12. if match_object:
    13. print('匹配到的QQ邮箱为:', match_object.group()) # 与match_object.group(0)结果相同,即将整个表达式看作一个分组
    14. print('匹配到的第一个分组数据为:', match_object.group(1), '第二个分组数据为:', match_object.group(2)) # 1为第一个分组,2即第二个分组,依次递推
    15. else:
    16. print('未匹配到所需邮箱')
    17. print('------------------------\数字--引用分组----------------------')
    18. # 想要提取哪一部分数据,就可使用分组括起来,通过group(i)来获取,i即表示第i个分组
    19. # \\i 表示引用第i个分组,相当于复制了该引用的分组
    20. print('-------------不使用引用-----------')
    21. match_object = re.match('<[0-9a-zA-Z]+><[0-9a-zA-Z]+>.*', '

      www.xqnav.top

      ') # 不使用引用,与不匹配也同样匹配成功
    22. if match_object:
    23. print('匹配结果为:', match_object.group())
    24. else:
    25. print('匹配失败')
    26. print('-------------使用引用------------')
    27. match_object = re.match('<([0-9a-zA-Z]+)><([0-9a-zA-Z]+)>.*', '

      www.xqnav.top

      '
      ) # \\1表示真正的\1,表示对前面第一个分组的引用
    28. if match_object:
    29. print('匹配结果为:', match_object.group())
    30. print('匹配到的第一个分组数据为:', match_object.group(1), '第二个分组数据为:', match_object.group(2))
    31. else:
    32. print('匹配失败')
    33. print('-------------使用引用----起别名--------')
    34. # (?P):给分组起别名
    35. # (?P=name):引用别名为name分组匹配到的字符串
    36. match_object = re.match('<(?P[0-9a-zA-Z]+)><(?P[0-9a-zA-Z]+)>.*', '

      www.xqnav.top

      '
      ) # \\1表示真正的\1,表示对前面第一个分组的引用
    37. if match_object:
    38. print('匹配结果为:', match_object.group())
    39. print('匹配到的第一个分组数据为:', match_object.group(1), '第二个分组数据为:', match_object.group(2))
    40. else:
    41. print('匹配失败')
    42. 输出:
    43. -------------------------匹配分组----------------------------
    44. 我喜欢Chinese
    45. 我喜欢math
    46. 我讨厌English
    47. 我讨厌physical
    48. 我喜欢history
    49. ------------------------(字符)分组--一个()即为一个分组------------------------
    50. 匹配到的QQ邮箱为: Hello_520@qq.com
    51. 匹配到的第一个分组数据为: qq 第二个分组数据为: com
    52. ------------------------\数字--引用分组----------------------
    53. -------------不使用引用-----------
    54. 匹配结果为:

      www.xqnav.top

    55. -------------使用引用------------
    56. 匹配结果为:

      www.xqnav.top

    57. 匹配到的第一个分组数据为: html 第二个分组数据为: h2
    58. -------------使用引用----起别名--------
    59. 匹配结果为:

      www.xqnav.top

    60. 匹配到的第一个分组数据为: html 第二个分组数据为: h2

    六、警告

    注:正则表达式中带反斜杠\的最好在其前多加一条反斜杠,即改为双反斜杠\\,如\\d

    1.未写为双反斜杠形式,会报PEP 8规范警告,如下

    PEP 8: W605 invalid escape sequence '\d'

    2.单词拼写正确性警告:Typo: In word 'xxx' 

    学习导航:http://xqnav.top/

  • 相关阅读:
    承接vue2->vue3的一些变动
    Windows安装Redis详细步骤
    Android 使用webView加载html页面
    完蛋,我被挖矿木马包围了|使用 TLS 连接 Docker
    MFC-对话框程序核心-IsDialogMessage函数-MSG 消息结构-GetMessage函数-DispatchMessage函数
    基础算法|快速排序|AcWing 785. 快速排序|2022-11-19
    【时间之外】风险经营的数字化
    熬夜万字肝爆Redis知识总结,全网最全
    [C++基础]-继承
    netfilter编程实例——一个简单的防火墙
  • 原文地址:https://blog.csdn.net/qq_43874317/article/details/127856170