zoukankan      html  css  js  c++  java
  • 正则表达式--元字符的使用

    一、基本简介:

    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.全面性,尽可能考虑到目标字符串的所有情况,不遗漏。

  • 相关阅读:
    LeetCode "Jump Game"
    LeetCode "Pow(x,n)"
    LeetCode "Reverse Linked List II"
    LeetCode "Unique Binary Search Trees II"
    LeetCode "Combination Sum II"
    LeetCode "Divide Two Integers"
    LeetCode "First Missing Positive"
    LeetCode "Clone Graph"
    LeetCode "Decode Ways"
    LeetCode "Combinations"
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11056072.html
Copyright © 2011-2022 走看看