zoukankan      html  css  js  c++  java
  • day23

    正则表达式:由一系列特殊字符拼接而成的表达式/规则,该表达式用于从一个大字符串中 匹配出符合规则的子字符串

    正则表达式在所有语言中,都是通用的。

    一:正则表达式表

    模式 描述
    w 匹配:数字、字母、下划线
    W 匹配:非数字、字母、下划线
    s 匹配:任意非空白字符,等价于 [ f]
    S 匹配:任意非空字符
    d 匹配:任意数字,等价于 [0-9]
    D 匹配:任意非数字字符
    A 匹配:字符串开始
    z 匹配:字符串结束
     匹配:字符串结束(如果存在换行,则只匹配到换行之前的结束字符串)
    G 匹配:最后匹配完成的位置
    匹配:一个换行符
    匹配:一个制表符
    ^ 匹配:字符串的开头
    $ 匹配:字符串的末尾
    . 匹配:任意字符(除了换行符 )末尾加上 re.DOTALL则可以包括任意字符(包括换行符)
    [...] 匹配:表示一组字符(除了换行符 )
    [^...] 匹配:不在[]中的字符
    * 匹配:0个或多个表达式,贪婪
    + 匹配:1个或多个表达式,贪婪
    ? 匹配:0个或1个前面的正则表达式定义的片段,非贪婪
    {n} 匹配:精确匹配n个前面的表达式
    {n,m} 匹配:n到m次 由前面的正则表达式定义的片段,非贪婪
    a丨b 匹配:a或者b
    () 匹配:括号内的表达式,表示一个分组

    二:正则表达式 详解

    w 匹配:数字 字母 下划线

    print(re.findall('w', "hello 123_(0"))
    
    # w:匹配 数字、字母、下划线(不包括空格)
    # ['h', 'e', 'l', 'l', 'o', '1', '2', '3', '_', '0']
    
    print(re.findall('www', "hello 123_(0"))
    
    # www:连续匹配3个连续的数字、字母、下划线(不包括空格),遇到空格就直接往后继续匹配
    # ['hel', '123']
    

    W匹配:非数字 字母 下划线

    print(re.findall('W', "hello 123_(0"))
    
    # W:匹配除了数字 字母 下划线之外的字符(包括空格)
    # [' ', '(']
    

    s 匹配:任意空白字符,等价于[ f]

    print(re.findall('s', "h ello 123_(0"))
    
    # s:匹配空白字符串
    # [' ', ' ']
    

    S 匹配:任意非空字符

    print(re.findall('S', "h ello 123_(0"))
    
    # S:匹配非空字符(除了空格和换行符之外的字符)
    # ['h', 'e', 'l', 'l', 'o', '1', '2', '3', '_', '(', '0']
    

    d 匹配任意数字 [0-9]

    print(re.findall('d', "h ello 123_(0"))
    
    # 匹配数字1-9
    # ['1', '2', '3', '0']
    

    D 匹配任意非数字

    print(re.findall('D', "h ello 123_(0"))
    
    # 匹配除了1-9之外的所有字符(包括空格、换行符	)
    # ['h', ' ', 'e', 'l', 'l', 'o', ' ', '_', '(']
    

    匹配一个换行符

    res = '''a sd  	asd
    
        	1
    2
    
    3
    '''
    print(re.findall('
    ', res))
    
    # 
    :匹配带有换行符的字符串
    # ['
    ', '
    ', '
    ', '
    ', '
    ', '
    ']
    

    匹配一个制表符

    msg="""h e	ll
    
    o 123_ (0
    	1
    """
    print(re.findall('	',msg))
    
    # 	:匹配带有制表符的字符串
    # ['	', '	']
    

    ^ 匹配以...开头的字符

    print(re.findall("^xxq", "xxq asdf 213123 xxqafsadfasdn"))
    
    # ^xxq:匹配以xxq开头的字符串
    # ['xxq']
    

    $ 匹配以...结尾的字符

    print(re.findall("xxq$","xxq asdf 213123 xxqafsadfxxq"))
    
    # xxq$:匹配以xxq为结尾的字符串
    # ['xxq']
    

    . 匹配任意一个字符(除了换行符

    print(re.findall("a.b", "a1b a2b aab aaaaaaab a+b a-b a b a c"))
    
    # a.b:匹配a和b中间有任意字符的字符串(除了换行符)
    # ['a1b', 'a2b', 'aab', 'aab', 'a+b', 'a-b', 'a b']
    

    [] 匹配一个字符,并且可以指定该字符的范围

    中间如果要匹配-,一定要放到最左边或者最右边,不然会被认定是一个范围符号

    print(re.findall("a[+-]b", "a1b a2b aab aaaaaaab a+b a-b a c"))
    # ['a+b', 'a-b']
    
    print(re.findall("a[.*/+-]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c"))
    # ['a.b', 'a*b', 'a/b', 'a+b', 'a-b']
    
    print(re.findall("a[a-z]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c"))  # -放在[]内的开头或结果
    # ['aab', 'aab']
    
    print(re.findall("a[a-zA-Z]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c"))  # -放在[]内的开头或结果
    # ['aAb', 'aCb', 'aab', 'aab']
    
    print(re.findall("adb", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c"))  # -放在[]内的开头或结果
    # ['a2b']
    
    print(re.findall("a[0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c"))  # -放在[]内的开头或结果
    # ['a2b']
    

    [^...]代表取反

    print(re.findall("a[^0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c"))
    
    # a[^0-9]b:匹配所有a和b中间不是数字的字符串
    # ['a.b', 'a*b', 'a/b', 'aAb', 'aCb', 'aab', 'aab', 'a+b', 'a-b']
    

    * 左边的字符出现0次或者无穷次

    print(re.findall("ab*", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    
    # ab*:匹配任意a后面b出现任意次的字符串
    # ['a', 'ab', 'abb', 'abbbbbbbbbbbb']
    

    +左边的字符出现1次或者无穷次

    print(re.findall("ab+", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    
    # ab*:匹配任意a后面b出现一次或者任意多次的字符串
    # ['ab', 'abb', 'abbbbbbbbbbbb']
    

    {n,m} 左边的字符出现n-m次

    print(re.findall("ab{0,}", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    
    # ab{0,}:匹配到a之后b出现任意次数的字符串
    # ['a', 'ab', 'abb', 'abbbbbbbbbbbb']
    
    print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    
    # ab*:匹配a后边任意个b的字符串
    # ['a', 'ab', 'abb', 'abbbbbbbbbbbb']
    
    print(re.findall("ab{1,}","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    
    # ab{1,}:匹配a后边至少1个b的字符串
    # ['ab', 'abb', 'abbbbbbbbbbbb']
    
    print(re.findall("ab+", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    
    # ab+:匹配a后边至少1个b的字符串
    # ['ab', 'abb', 'abbbbbbbbbbbb']
    
    print(re.findall("ab?", "a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    
    # ab?:匹配a后边的b出现0次或者1次的字符串
    # ['a', 'ab', 'ab', 'ab']
    

    () 分组

    三:拓展

    print(re.findall("adb","a1b a2b aab aaaaaaab a+b a-b a c"))
    
    # adb:匹配a和b中间有一个数字的字符串
    # ['a1b', 'a2b']
    
    print(re.findall("awb","a1b a2b aab aaaaaaab a+b a-b a c"))
    # awb:匹配a和b中间有一个数字字母下划线的字符串
    # ['a1b', 'a2b', 'aab', 'aab']
    
    print(re.findall("a.b","a1b a2b aab aaaaaaab a+b a-b a b a c"))
    # .:匹配a和b中间有一个任意字符的字符串(不包括
    )
    # ['a1b', 'a2b', 'aab', 'aab', 'a+b', 'a-b', 'a b']
    
    print(re.findall("a.b", "a1b a2b aab aaaaaaab a	b a-b a
    b a c", re.DOTALL))
    # .:匹配a和b中间有一个任意字符的字符串(加了re.DOTALL可以匹配换行符)
    # ['a1b', 'a2b', 'aab', 'aab', 'a	b', 'a-b', 'a
    b']
    
    print(re.findall("a.*b", "123 a1231-==-000b123123123123123b"))
    
    # a.*b:匹配a和b中间有任意几个字符的字符串
    # ['a1231-==-000b123123123123123b']
    

    例子:

    1.提取出下面msghref后的链接地址

    msg = '<a href="https://pan.baidu.com/s/1skWyTT7" target="_blank"><a href="https://www.baidu.com">"点我啊"</a>'
    print(re.findall('href="(.*?)"', msg))
    
    # ['https://pan.baidu.com/s/1skWyTT7', 'https://www.baidu.com']
    

    2.

  • 相关阅读:
    【leetcode】49. 字母异位词分组
    【leetcode】48. 旋转图像
    【leetcode】48. 全排列 2
    Day4前端学习之路——背景边框列表链接和更复杂的选择器
    Day3前端学习之路——CSS基本知识
    Day2前端学习之路——HTML基本知识
    Day1前端学习之路——概述
    Axure实现抽奖转盘(二)
    Axure实现百度登录页面(一)
    线性代数课程较好的资料
  • 原文地址:https://www.cnblogs.com/xuexianqi/p/13426498.html
Copyright © 2011-2022 走看看