• 正则表达式--元字符的使用


    一、基本简介:

    1. 定义:即文本的高级匹配模式,提供搜索,替换等功能。其本质是由一系列字符和特殊符号构成的字串,这个字串即正则表达式。

    2. 原理:通过普通字符和有特定含义的字符,来组成字符串,用以描述一定的字符串规则,比如:重复,位置等,来表达某类特定的字符串,进而匹配。

    3. 目标

    • 熟练掌握正则表达式元字符
    • 能够读懂常用正则表达式,编辑简单的正则规则
    • 能够熟练使用re模块操作正则表达式

    二、元字符使用:

    1.普通字符:

    • 匹配规则:每个普通字符匹配其对应的字符
    • 例子:re.findall('ab',"abcdefabcd")
    • # ['ab', 'ab']

    注意事项:正则表达式在python中也可以匹配中文

    2.元字符:| (或关系)

    • 匹配规则:匹配 | 两侧任意的正则表达式即可
    • 例子:re.findall('com|cn',"www.baidu.com/www.tmooc.cn")
    • #['com', 'cn']

    3.元字符:. (匹配单个元字符)

    • 匹配规则:匹配除换行外的任意一个字符
    • 例子:re.findall('张.丰',"张三丰,张四丰,张五丰")
    • # ['张三丰', '张四丰', '张五丰']

    4.元字符: [字符集]

    • 匹配规则: 匹配字符集中的任意一个字符
    • 表达形式: 
      • [abc#!好] 表示 [] 中的任意一个字符
      • [0-9],[a-z],[A-Z] 表示区间内的任意一个字符
      • [_#?0-9a-z]  混合书写,一般区间表达写在后面
    • 例子:re.findall('[aeiou]',"How are you!")
    • # ['o', 'a', 'e', 'o', 'u']

    5.元字符:[^字符集] (匹配反字符集)

    • 匹配规则:匹配除了字符集以外的任意一个字符
    • 例子:re.findall('[^0-9]',"Use 007 port")
    • #['U', 's', 'e', ' ', ' ', 'p', 'o', 'r', 't']

    6.元字符:^           A

    • 匹配规则:匹配字符串开始位置
    • 例子:re.findall('^Jame',"Jame,hello")
    • #['Jame']

    7.元字符:$           

    • 匹配规则:匹配目标字符串的结尾位置
    • 例子:re.findall('Jame$',"Hi,Jame")
    • #['Jame']

    规则技巧: ^ 和 $必然出现在正则表达式的开头和结尾处。如果两者同时出现,则中间的部分必须匹配整个目标字符串的全部内容。

    8.元字符:*

    • 匹配规则:匹配前面的字符出现0次或多次
    • 例子:re.findall('wo*',"wooooo~~w!")
    • #['wooooo', 'w']

    9.元字符:+

    • 匹配规则:匹配前面的字符出现1次或多次
    • 例子:re.findall('[A-Z][a-z]+',"Hello World")
    • #['Hello', 'World']

    10.元字符:?

    • 匹配规则:匹配前面的字符出现0次或1次
    • 例子:匹配手机号 re.findall('-?[0-9]+',"Jame,age:18, -26")
    • #['18', '-26']

    11.元字符:{n}

    • 匹配规则:匹配前面的字符出现n次
    • 例子:re.findall('1[0-9]{10}',"Jame:13886495728")
    • #['13886495728']

    12.元字符:{m,n}

    • 匹配规则: 匹配前面的字符出现m-n次
    • 例子:匹配QQ号 re.findall('[1-9][0-9]{5,10}',"Baron:1259296994") 
    • #['1259296994']

    13.元字符:d   D

    • 匹配规则:d 匹配任意数字字符,D 匹配任意非数字字符
    • 例子:匹配端口 re.findall('d{1,5}',"Mysql: 3306, http:80")
    • #['3306', '80']

    14.元字符:w   W

    • 匹配规则:w 匹配普通字符,W 匹配非普通字符
    • 说明: 普通字符指数字,字母,下划线,汉字。
    • 例子: re.findall('w+',"server_port = 8888")
    • #['server_port', '8888']

    15.元字符:s   S

    • 匹配规则:s 匹配空字符,S 匹配非空字符
    • 说明:空字符指 空格 v f 字符
    • 例子: re.findall('w+s+w+',"hello    world")
    • #['hello    world']

    16.元字符:s   S

    • 匹配规则:s 匹配空字符,S 匹配非空字符
    • 说明:空字符指 空格 v f 字符
    • 例子: re.findall('w+s+w+',"hello    world")
    • #['hello    world']

    17.元字符:   B

    • 匹配规则: 表示单词边界,B 表示非单词边界
    • 说明:单词边界指数字字母(汉字)下划线与其他字符的交界位置。
    • 例子:re.findall(r'is',"This is a test.")
    • #['is']

    三、普通字符集的替换

    正则 扩充表达式 匹配
    d

    [0-9]

    数字字符
    D

    [^0-9]

    非数字字符
    w

    [a-zA-Z0-9]

    数字字母下划线
    W

    [^w]

    相反
    s

    [_ f]

    表格,换行等空白区域
    S

    [^s]

    非空白区域

    四、计数符

    正则

    匹配

    *

    +

    ?

    {n}

    {n,m}

    {n,}

    零或多

    一或多

    零或一

    出现n次

    n到m次

    至少n次

     五、正则表达式的转义

    1. 如果使用正则表达式匹配特殊字符则需要加 表示转义。

    • 特殊字符: . * + ? ^ $ [] () {} |
    • 匹配特殊字符 . 时使用 . 表示本身含义
    •  例子1:re.findall('-?d+.?d*',"123,-123,1.23,-1.23")
    •  #['123', '-123', '1.23', '-1.23']
    • 例子2:s="1992年5月2日出生于中国,中国内地影视女演员-12,12.34,1/0,40%,-1.6"
    • r=re.findall('-?d+.?/?d*%?',s) 
    • #['1992', '5', '2', '-12', '12.34', '1/0', '40%', '-1.6']

    2. 在编程语言中,常使用原生字符串书写正则表达式避免多重转义的麻烦。

    • python字符串  -->    正则    -->    目标字符串
    • "\$\d+"   解析为   $d+   匹配   "$100"
    • "\$\d+"  等同于  r"$d+"

    六、贪婪模式和非贪婪模式

    贪婪模式: 默认情况下,匹配重复的元字符总是尽可能多的向后匹配内容。比如: *  +  ?  {m,n}

    非贪婪模式(懒惰模式): 让匹配重复的元字符尽可能少的向后匹配内容。

    贪婪模式转换为非贪婪模式

    在匹配重复元字符后加 '?' 号即可

    *  :  *?  #1
    +  :  +?  #1
    ?  :  ??  #0
    {m,n} : {m,n}?  #n

    • 例子: re.findall(r'(.+?)',"(abcd)efgh(higk)")
    • # ['(abcd)', '(higk)']

    七、正则表达式分组

    1.定义:

      在正则表达式中,以()建立正则表达式的内部分组,子组是正则表达式的一部分,可以作为内部整体操作对象。

    2.作用:

      (1)可以别作为整体操作,改变元字符的操作对象。

    #(1)改变 +号 重复的对象
    re.search(r'(ab)+',"ababababab").group()
     #'ababababab'
    #(2)改变 |号 操作对象
    re.search(r'(王|李)w{1,3}',"王者荣耀").group()
    #'王者荣耀'

      (2)可以通过编程语言某些借口获取陪陪内容中子组对应的内容部分

    #获取url协议类型
    re.search(r'(https|http|ftp|file)://S+',"https://www.baidu.com").group(1)

    3.捕获组:

      可以给正则表达式的子组起一个名字,表达该子组的意义。这种有名称的子组即为捕获组

      格式:"(?P<name>pattern)"

    #给子组命名为 "pig"
    re.search(r'(?P<pig>ab)+',"ababababab").group('pig')
    #'ab'

    4.注意事项:

    • 一个正则表达式中可以包含多个子组
    • 子组可以嵌套,但是不要重叠或者嵌套结构复杂
    • 子组序列号一般从外到内,从左到右计数

    八、正则表达式原则

    1.正确性,能够正确的匹配出目标字符串。

    2.排他性,除了目标字符串意外尽可能少的匹配其他内容。

    3.全面性,尽可能考虑到目标字符串的所有情况,不遗漏。

  • 相关阅读:
    C++范围解析运算符::的使用
    C程序的内存布局
    ARM中LDR伪指令与LDR加载指令
    每天一个linux命令(12):more命令
    C++ explicit关键字
    C++内联函数详解
    C++友元详解
    C++ new操作符详解
    CDN技术详解笔记
    字符串匹配(KMP 算法 含代码)
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11056072.html
Copyright © 2020-2023  润新知