Day17 正则表达式

正则表达式

  1. 正则表达式(通用语法)
    正则就是一种用来做字符串匹配的工具,通过不同的符号匹配不同的字符

  2. python对正则表达式的支持
    通过re模块提供相应支持正则表达式的方法
    fullmatch(正则表达式,匹配的字符串) ---> 用正则表达式和指定字符串进行匹配,如果匹配成功
    返回匹配对象,匹配失败返回None
    python中的正则表达式是写在字符串中的,但是一般情况下会在前面加r/R

    • 普通字符(代表字符本身

      # 匹配一个字符串,只有三个字符,并且每个字符分别是a,b,c
      re_str = r'abc'
      result = fullmatch(re_str, 'abc')
      print(result)
      
      运行结果:
      <_sre.SRE_Match object; span=(0, 3), match='abc'>
      
    • . (匹配任意字符) 出现点,这个点可以表示任意字符,一个点代表一个字符

    """
    注意:a.一个点代表一个字符
          b.\n匹配不到
    """
    # 匹配一个字符串,只有三个字符,第一个字符是a,第二个字符是任意字符,第三个字符是c
    re_str = r'a.c'
    result = fullmatch(re_str, 'a\c')
    print(result)
    
    运行结果:
    <_sre.SRE_Match object; span=(0, 3), match='a\\c'>
    
    • \w (匹配一个表示字母数字下划线)
    """
    注意:a.也可以匹配中文
         b.一个\w只能匹配一个字符
    """
    # 匹配一个字符串,第一个字符串是任意字符,第二三个字符是字母、数字或者_,最后三个是abc
    re_str = r'.\w\wabc'
    result = fullmatch(re_str, '$赵_abc')
    print(result)
    
    运行结果:
    <_sre.SRE_Match object; span=(0, 6), match='$赵_abc'>
    
    • \s (匹配空白字符)
    """
    空白字符:指的是所有能产生空白的字符,包括空格、制表符、换行等
    """
    # 匹配一个字符串,前两个是字母数字下划线或者中文,第三个字符是空白,最后一个是任意字符
    re_str = r'\w\w\s.'
    result = fullmatch(re_str, 'a_\t$')
    print(result)
    
    运行结果:
    <_sre.SRE_Match object; span=(0, 4), match='a_\t$'>
    
    • \d (匹配数字字符)

      # 一个字符串有三个字符,每个字符都是数字字符
      re_str = r'\d\d\d'
      result = fullmatch(re_str, '789')
      print(result)
      
      运行结果:
      <_sre.SRE_Match object; span=(0, 3), match='789'>
      
    • \b (检测单词边界)

    """
    a.检测正则表达式中\b所在的位置是否是单词边界
    b.所有可以两个单词区分开的符号都是单词边界
    例如: 空格,缩进,标点符号,单词开头结尾
    
    注意:\b不是匹配符号,不会匹配出一个字符,只能检测所在的位置是否满足要求
    """
    # 匹配一个字符串的内容是否是'how are',并且要求a的前面是单词边界
    re_str = r'\bhow\b are'
    result = fullmatch(re_str, 'how are')
    print(result)
    print(search(r'\b\d\d\d', 'ada 456qwe123asdasd78'))
    
    运行结果:
    <_sre.SRE_Match object; span=(0, 7), match='how are'>
    <_sre.SRE_Match object; span=(4, 7), match='456'>
    
    • ^ (检测字符串开头)

      """
      匹配一个字符串是三个数字字符,并且第一个字符前所在的位置是字符串开头,写在正则表达式前面,其他位置无意义
      """
      re_str = r'^\d\d\d'
      result = search(re_str, '789asdjak45897asd78')
      print(result)
      
      运行结果:
      <_sre.SRE_Match object; span=(0, 3), match='789'>
      
    • $ (检测字符串结尾)

    # 匹配一个字符串是三个数字字符,并且最后一个字符的后面是字符串结尾
    re_str = r'\d\d\d$'
    result = search(re_str, 'asdasda4563')
    print(result)
    
    运行结果:
    <_sre.SRE_Match object; span=(8, 11), match='563'>
    
    • \B (检测非单词边界)

      re_str = r'a\Babc'
      result = search(re_str, 'aabc')
      print(result)
      
      运行结果:
      <_sre.SRE_Match object; span=(0, 4), match='aabc'>
      
    • \W (匹配非数字字母下划线中文)

    • \S (匹配非空白字符)

    • \D (匹配非数字字符)

    • [字符集](匹配字符集中的任意一个字符)

      """
      a.普通用法
      [字符集]  -  匹配字符集中的任意一个字符
      b.表示范围
      [字符1-字符2]  -  匹配字符1到字符2中所有的字符,要求字符1的编码值要小于字符2的编码值
      [a-zA-z123]  -  表示所有字母和123中的任意一个
      [a-zA-Z\d_]  -  数字字母下划线
      """
      # 匹配一个字符串有4个字符,第一个字符是 a  b  c  中的任意一个,后面是123
      re_str = r'[abc]123'
      result = fullmatch(re_str, 'a123')
      print(result)
      
      # 匹配一个字符串有4个字符,第一个字符是a-z中的任意一个,中间两个是数字字符,最后一个字符为1-9中的任意一个
      re_str = r'[a-z]\d\d[1-9]'
      result = fullmatch(re_str, 's875')
      print(result)
      
      运行结果:
      <_sre.SRE_Match object; span=(0, 4), match='a123'>
      <_sre.SRE_Match object; span=(0, 4), match='s875'>
      
    • [^字符集] - 匹配非字符集中的任意字符

      """
      注意:^  放在[]的对前面才表示匹配不在字符集中的其他任意字符
              如果不放在最前面就表示字符 ^ 本身
      """
      # 匹配一个字符串,第一个字符只要不是abc中的一个 其他字符都可以,后面是123
      re_str = r'[^abc]123'
      result = fullmatch(re_str, 's123')
      print(result)
      
      # 匹配一个字符串,第一个字符只要不是字母中的一个 其他字符都可以,后面是123
      re_str = r'[^A-Za-z]123'
      result = fullmatch(re_str, '5123')
      print(result)
      
      运行结果:
      <_sre.SRE_Match object; span=(0, 4), match='s123'>
      <_sre.SRE_Match object; span=(0, 4), match='5123'>
      
    • 转义符号

      """
      a.正则中也可以通过在特殊符号前加'\'来队符号进行转义
      \\ --  \字符
      \.  --  .字符
      注意:转义字符是字符串中的概念,
              转义符号是正则表达式的概念
      
      b.除了在中括号中有特殊意义的符号,其他符号放在[]中也表示符号本身
          -  :  在中括号中两个字符之间表示谁到谁,如果想要表示他本身,就不要放在两个字符之间,放在开头或者末尾
          ^  :  在中括号的最前面有特殊意义,如果想要表示本身,就不要放在最前面
          ]  :  在[]中表示中括号,要加\
      """
      re_str = r'\d\d\.\d\d'
      print(fullmatch(re_str, '78.45'))
      
      print(fullmatch(r'[.]', '.'))
      print(fullmatch(r'[.]', '2'))
      
      运行结果:
      <_sre.SRE_Match object; span=(0, 5), match='78.45'>
      <_sre.SRE_Match object; span=(0, 1), match='.'>
      None
      

匹配次数

  1. * (匹配0次或者多次)

    """
    字符*  -  指定的字符出现0次或者多次(这的字符可以是正则符号也可以是普通字符)
    
    a*  -  a出现0次或者多次
    \d  -  任意数字出现0次或者多次
    [a-z]* - 任意一个小写字母出现0次或多次
    """
    # 123前面有0个或多个字符,并且每个字符都是字符a
    re_str = r'a*123'
    print(re.fullmatch(re_str, 'aa123'))
    print(re.fullmatch(re_str, '123'))
    
    # 123前面有0个或多个字符,并且每个字符都是数字字符
    re_str = r'[a-z]*123'
    print(re.fullmatch(re_str, 'asd123'))
    print(re.fullmatch(re_str, '123'))
    
    运行结果:
    <_sre.SRE_Match object; span=(0, 5), match='aa123'>
    <_sre.SRE_Match object; span=(0, 3), match='123'>
    <_sre.SRE_Match object; span=(0, 6), match='asd123'>
    <_sre.SRE_Match object; span=(0, 3), match='123'>
    
  2. + (匹配一次或多次)

    re_str = r'[a-z]+123'
    print(re.fullmatch(re_str, 'asd123'))
    print(re.fullmatch(re_str, '123'))
    
    运行结果:
    <_sre.SRE_Match object; span=(0, 6), match='asd123'>
    None
    
  3. ? (匹配0次或1次)

    re_str = r'[a-z]?123'
    print(re.fullmatch(re_str, 'asd123'))
    print(re.fullmatch(re_str, '123'))
    print(re.fullmatch(re_str, 'w123'))
    
    # 练习:写一个正则表达式,能够匹配所有的整数字符串
        """
        123
        +123
        -123
        0023   不是整数
        """
        re_str = r'[-+]?[1-9]\d|0*'
        print(re.fullmatch(re_str, '456'))
        print(re.fullmatch(re_str, '+456'))
        print(re.fullmatch(re_str, '0'))
    
    运行结果:
    None
    <_sre.SRE_Match object; span=(0, 3), match='123'>
    <_sre.SRE_Match object; span=(0, 4), match='w123'>
    
  4. {}

    """
    {M,N}  -  匹配M到N次  最少M次最多N次
    {M,}   -  最少M次
    {,N}  -  最多N次
    {N}    -  只有N次
    
    """
    print(re.fullmatch(r'a{2,5}', 'aaa'))
    
    # 密码要求:6-16位,只能包含数字和字母
    re_str = r'[a-zA-z\d]{6,16}'
    print(re.fullmatch(re_str, 'asdasd7896'))
    
    运行结果:
    None
    None
    <_sre.SRE_Match object; span=(0, 1), match='0'>
    <_sre.SRE_Match object; span=(0, 3), match='aaa'>
    <_sre.SRE_Match object; span=(0, 10), match='asdasd7896'>
    

分之和分组

  1. | (分之)
    表达式1|表达式2|表达式3 - 先用表达式1进行匹配,若成功,则成功,不成功就使用表达式2,然后依次进行
    (三个表达式中有一个成功就成功,若三个都不满足就失败)

  2. () (分组)

    a. 分组 - 将括号的内容看成一个整体
    b. 分组重复 - 在含有分组的正则表达式中可以再分组的后面通过'\数字'来重复前面第几个分组匹配到的内容
    (\d{2})abc\1 --> 7878

    re_str = r'[a-z]{3}|\d{3}'
    print(re.fullmatch(re_str, '879'))
    
    re_str = r'abc([A-Z]{2}|\d{2})'
    print(re.fullmatch(re_str, 'abc45'))
    
    # (abc){2}  abc作为一个整体出现2次
    re_str = r'(abc){2}'
    print(re.fullmatch(re_str, 'abcabc'))
    
    re_str = r'\d{2}abc'
    print(re.fullmatch(re_str, '34abc'))
    
    re_str = r'(\d{2})a(\d{3})bc\2'
    print(re.fullmatch(re_str, '34a123bc123'))
    
    运行结果:
    <_sre.SRE_Match object; span=(0, 3), match='879'>
    <_sre.SRE_Match object; span=(0, 5), match='abc45'>
    <_sre.SRE_Match object; span=(0, 6), match='abcabc'>
    <_sre.SRE_Match object; span=(0, 5), match='34abc'>
    <_sre.SRE_Match object; span=(0, 11), match='34a123bc123'>
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • from re import fullmatch, search,findall 正则表达式就是用来检测字符串是否...
    文_36e3阅读 415评论 0 0
  • 1.正则基本符号 1.什么是正则表达式正则表达式就是字符匹配工具;是由正则符号和普通字符组成,来匹配不同规律的字符...
    杨海py阅读 804评论 0 0
  • 正则表达式 正则表达式使用匹配或者秒速字符串的工具。用处:a.判断字符串是否满足某个条件--判断输入的字符串是否是...
    文_36e3阅读 552评论 0 0
  • 夜阑珊,酒正酣,西窗微烛映池汤。鸣孤蝉,离人散,独拾狼藉,对影偷欢。 将,将,将! 曲悠扬,意悠长,雨打芭蕉尽消残...
    无乐之章阅读 192评论 0 0
  • 飞过河不是一件难事 从来也没有想到河的那边去 朝朝暮暮的低头抬头 呼吸均匀 神态自若 在树梢上侃侃而谈 被春天的和...
    团结巷徐阅读 321评论 1 5