zoukankan      html  css  js  c++  java
  • re模块

    一:什么是正则?

     正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

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

    二:常用匹配模式(元字符)

    w匹配字母数字下划线,结果为多个字符串组成的列表
    W匹配与w相反
    s匹配任意空白字符,	 
     
     f都属于空白字符(f匹配后变成x0c)
    S匹配与s相反
    d匹配任意数字,等价于[0,9]
    D匹配与d相反
    
    匹配
    
    	匹配	
    (只匹配1个str)^ 匹配字符串开头
    (只匹配1个str)$ 匹配字符串结尾
    .匹配任意字符,除了换行符,当re.DOTALL或re.S标记被指定时,则可以匹配包括换行符的任意字符
    *匹配0个或多个的表达式
    +匹配1个或多个的表达式
    ?匹配0个或1个由前面的表达式定义的片段,非贪婪方式
    ^ 取反 d
    +.?d*匹配所有包含小数在内的数字 .*默认为贪婪匹配 .*?为非贪婪匹配:推荐使用 [...]用来表示一组字符,例如[abc]匹配'a','b','c',[]内的字符都是普通字符了,且如果 - 没有被转意的话,应该放到[]的开头或结尾,如果放在中间容易转意为比如所有英文字母a-z;[]内的^代表的意思是取反 {n}精准匹配n个前面表达式 {n,m}匹配到n到m次由前面的正则表达式定义的片段,贪婪方式(最小取的是n个,最大取得片段是m个) a|b匹配a或b ()匹配括号内的表达式,也表示一个组 ?:可以让结果为匹配的全部内容
    *  *左边那个字符出现0次或者无穷次
    
    +  +左边那个字符出现1次或者无穷次
    {n,m}左边那个字符出现n次到m次
    ? 左边那个字符出现0次到1次
    
    .* 匹配所有,遇到
    就截断字符串,匹配空字符串,再继续,到最后面默认有个换行符,也匹配出空字符串
    ?:  取消()比如(ab),那么就变成ab
    d+.?d* 匹配出数字或 小数
    # 1、w
    # print(re.findall('www',"h ello 123_ (0"))
    # h ello 123_ (0
    #            www
    
    # 2. W
    # print(re.findall('W',"h ello 123_ (0"))
    
    # 3、s
    # print(re.findall('s',"h e	ll
    o 123_ (0"))
    # print(re.findall('ws',"h ello 123_ (0"))
    
    # 4、S
    # print(re.findall('S',"h e	ll
    o 123_ (0"))
    
    # 5、d
    # print(re.findall('d',"h e	ll
    o 123_ (0"))
    
    # 6、D
    # print(re.findall('D',"h e	ll
    o 123_ (0"))
    
    # print(re.findall("adb","a1b a2b a b aab aaaaaaaa1b a2c a22c a 3c"))
    # a1b a2b a b aab aaaaaaaa1b a2c a22c a 3c
    #                            adb
    
    # ["a1b","a2b","a1b"]
    
    # 7、
    与	
    # msg="""h e	ll
    
    o 123_ (0
    # 	1
    #     2
    # 3
    # """
    # print(re.findall('
    ',msg))
    # print(re.findall('	',msg))
    # print(re.findall(' ',msg))
    
    
    # 8、^与$
    # print(re.findall("^egon","egon asdf 213123 egonafsadfegon"))
    # egon asdf 213123 egonafsadfegon
    # ^egon
    
    # print(re.findall("egon$","egon asdf 213123 egonafsadfegon "))
    #                                                        egon$
    
    
    # print(re.findall("awwwc","ab12c3c a213c"))
    # print(re.findall("^awwwc$","ab_2c"))
    
    # 9、.与[]
    # 9.1 .:代表匹配一个字符,该字符可以是任意字符
    # print(re.findall("adb","a1b a2b aab aaaaaaab a+b a-b a c"))
    # print(re.findall("awb","a1b a2b aab aaaaaaab a+b a-b a c"))
    # print(re.findall("a.b","a1b a2b aab aaaaaaab a+b a-b a b a c"))
    # print(re.findall("a.b","a1b a2b aab aaaaaaab a	b a-b a
    b a c",re.DOTALL))
    
    
    # 9.2 []:代表匹配一个字符,我们可以指定该字符的范围
    # print(re.findall("a[+-]b", "a1b a2b aab aaaaaaab a+b a-b a c"))
    # print(re.findall("a[.*/+-]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c"))
    # print(re.findall("a[a-z]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
    # 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")) # -放在[]内的开头或结果
    # print(re.findall("adb", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
    # print(re.findall("a[0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
    
    # [^...]代表取反
    # print(re.findall("a[^0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
    
    # 9.3 *: 左边那个字符出现0次或者无穷次
    # print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    # a ab abb abbbbbbbbbbbb bbbbbbbbb
    #                        ab*
    
    # 9.4 +: 左边那个字符出现1次或者无穷次
    # print(re.findall("ab+","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    # a ab abb abbbbbbbbbbbb bbbbbbbbb
    # ab+
    
    # 9.5 {n,m}: 左边那个字符出现n次到m次
    # print(re.findall("ab{0,}","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    # print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    # print(re.findall("ab{1,}","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    # print(re.findall("ab+","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    
    # print(re.findall("ab{2,5}","a ab abb abbb abbbb abbbbbbbb abbbbbbbbbbbb bbbbbbbbb"))
    
    # 9.6 ?: 左边那个字符出现0次到1次
    # print(re.findall("ab?","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    
    
    # 9.7 .*: 匹配所有
    # print(re.findall("a.*b","123 a1231-==-000b123123123123123b"))
    # 123 a1231-==-000b123123123123123b
    #     a.*b
    
    # print(re.findall("a.*?b","123 a1231-==-000b123123123123123b"))
    
    # 例1:()匹配括号内的表达式,也表示一个组
    msg = '<a href="https://pan.baidu.com/s/1skWyTT7" target="_blank"><strong><span style="color: #ff0000;">原理图:https://pan.baidu.com/s/1skWyTT7</span></strong></a><a href="https://www.baidu/com">"点我啊"</a>'
    url_pattern = re.compile('href="(.*?)"')
    # res=url_pattern.findall(msg)
    # print(res)
    
    res=url_pattern.findall('<a href="www.sina.com.cn"></a>')
    print(res)
    
    # 例2:正则表达式一行一行匹配
    print(re.findall("a.*b","a1b a+b a-b a
    b a	b",re.DOTALL))
    
    # 10 
    # print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
    # print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
    # ababab123
    # (ab)(ab)(ab)(ab)
    
    # 10.1 取消分组
    # print(re.findall('(?:ab)+123','ababab123')) #findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
    
    
    # 11 |:或者
    # print(re.findall("compan(?:ies|y)","Too many companies have gone bankrupt, and the next one is my company'"))
    
    # Too many companies have gone bankrupt, and the next one is my company
    #                                                               compan(ies|y)
    
    # print(re.findall("d+.?d*","as9fdasl333...4444df1111asdf3333dfadf333.44dafadf3.5555asdfsafd.5555"))
    # as9fdasldf1111asdf3333dfadf333.44dafadf3.5555asdfsafd.5555
    #                            d+.?d*
    
    
    
    # 12. 
    # print(re.findall('a\\c','ac a1c aac')) #对于正则来说a\c确实可以匹配到ac,但是在python解释器读取a\c时,会发生转义,然后交给re去执行,所以抛出异常
    # print(re.findall(r'a\c','ac a1c aac')) #对于正则来说a\c确实可以匹配到ac,但是在python解释器读取a\c时,会发生转义,然后交给re去执行,所以抛出异常
    # =================================匹配模式=================================
    #一对一的匹配
    # 'hello'.replace(old,new)
    # 'hello'.find('pattern')
    
    #正则匹配
    import re
    #w与W
    print(re.findall('w','hello egon 123')) #['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3']
    print(re.findall('W','hello egon 123')) #[' ', ' ']
    
    #s与S
    print(re.findall('s','hello  egon  123')) #[' ', ' ', ' ', ' ']
    print(re.findall('S','hello  egon  123')) #['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3']
    
    #
     	都是空,都可以被s匹配
    print(re.findall('s','hello 
     egon 	 123')) #[' ', '
    ', ' ', ' ', '	', ' ']
    
    #
    print(re.findall(r'
    ','hello egon 
    123')) #['
    ']
    print(re.findall(r'	','hello egon	123')) #['
    ']
    
    #d与D
    print(re.findall('d','hello egon 123')) #['1', '2', '3']
    print(re.findall('D','hello egon 123')) #['h', 'e', 'l', 'l', 'o', ' ', 'e', 'g', 'o', 'n', ' ']
    
    #A与
    print(re.findall('Ahe','hello egon 123')) #['he'],A==>^
    print(re.findall('123','hello egon 123')) #['he'],==>$
    
    #^与$
    print(re.findall('^h','hello egon 123')) #['h']
    print(re.findall('3$','hello egon 123')) #['3']
    
    # 重复匹配:| . | * | ? | .* | .*? | + | {n,m} |
    #.
    print(re.findall('a.b','a1b')) #['a1b']
    print(re.findall('a.b','a1b a*b a b aaab')) #['a1b', 'a*b', 'a b', 'aab']
    print(re.findall('a.b','a
    b')) #[]
    print(re.findall('a.b','a
    b',re.S)) #['a
    b']
    print(re.findall('a.b','a
    b',re.DOTALL)) #['a
    b']同上一条意思一样
    
    #*
    print(re.findall('ab*','bbbbbbb')) #[]
    print(re.findall('ab*','a')) #['a']
    print(re.findall('ab*','abbbb')) #['abbbb']
    
    #?
    print(re.findall('ab?','a')) #['a']
    print(re.findall('ab?','abbb')) #['ab']
    #匹配所有包含小数在内的数字
    print(re.findall('d+.?d*',"asdfasdf123as1.13dfa12adsf1asdf3")) #['123', '1.13', '12', '1', '3']
    
    #.*默认为贪婪匹配
    print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b']
    
    #.*?为非贪婪匹配:推荐使用
    print(re.findall('a.*?b','a1b22222222b')) #['a1b']
    
    #+
    print(re.findall('ab+','a')) #[]
    print(re.findall('ab+','abbb')) #['abbb']
    
    #{n,m}
    print(re.findall('ab{2}','abbb')) #['abb']
    print(re.findall('ab{2,4}','abbb')) #['abb']
    print(re.findall('ab{1,}','abbb')) #'ab{1,}' ===> 'ab+'
    print(re.findall('ab{0,}','abbb')) #'ab{0,}' ===> 'ab*'
    
    #[]
    print(re.findall('a[1*-]b','a1b a*b a-b')) #[]内的都为普通字符了,且如果-没有被转意的话,应该放到[]的开头或结尾
    print(re.findall('a[^1*-]b','a1b a*b a-b a=b')) #[]内的^代表的意思是取反,所以结果为['a=b']
    print(re.findall('a[0-9]b','a1b a*b a-b a=b')) #[]内的^代表的意思是取反,所以结果为['a=b']
    print(re.findall('a[a-z]b','a1b a*b a-b a=b aeb')) #[]内的^代表的意思是取反,所以结果为['a=b']
    print(re.findall('a[a-zA-Z]b','a1b a*b a-b a=b aeb aEb')) #[]内的^代表的意思是取反,所以结果为['a=b']
    
    ## print(re.findall('a\c','ac')) #对于正则来说a\c确实可以匹配到ac,但是在python解释器读取a\c时,会发生转义,然后交给re去执行,所以抛出异常
    print(re.findall(r'a\c','ac')) #r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义
    print(re.findall('a\\c','ac')) #同上面的意思一样,和上面的结果一样都是['a\c']
    
    #():分组
    print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
    print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
    print(re.findall('(?:ab)+123','ababab123')) #findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
    print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">点击</a>'))#['http://www.baidu.com']
    print(re.findall('href="(?:.*?)"','<a href="http://www.baidu.com">点击</a>'))#['href="http://www.baidu.com"']
    
    #|
    print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))

    三、re模块提供的方法介绍
    import re
    
    # print(re.search("d+.?d*","1.3 aa3.44aaa").group())
    # print(re.search("d+.?d*","asdfsadf"))
    
    # print(re.search("d+.?d*"," 1.3 aa3.44aaa"))
    # print(re.match("d+.?d*"," 1.3 aa3.44aaa"))
    
    # msg="egon:18-male=10"
    # print(msg.split(':'))
    
    # print(re.split('[:=-]',msg))
    
    
    # msg='<a href="https://pan.baidu.com/s/1skWyTT7" target="_blank"><strong><span style="color: #ff0000;">原理图:https://pan.baidu.com/s/1skWyTT7</span></strong></a><a href="https://www.baidu/com">"点我啊"</a>'
    # print(re.findall('href=".*?"',msg))
    import re
    #1
    print(re.findall('e','alex make love') )   #['e', 'e', 'e'],返回所有满足匹配条件的结果,放在列表里
    #2
    print(re.search('e','alex make love').group()) #e,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
    
    #3
    print(re.match('e','alex make love'))    #None,同search,不过在字符串开始处进行匹配,完全可以用search+^代替match
    
    #4
    print(re.split('[ab]','abcd'))     #['', '', 'cd'],先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割
    
    #5
    print('===>',re.sub('a','A','alex make love')) #===> Alex mAke love,不指定n,默认替换所有
    print('===>',re.sub('a','A','alex make love',1)) #===> Alex make love
    print('===>',re.sub('a','A','alex make love',2)) #===> Alex mAke love
    print('===>',re.sub('^(w+)(.*?s)(w+)(.*?s)(w+)(.*?)$',r'52341','alex make love')) #===> love make alex
    
    print('===>',re.subn('a','A','alex make love')) #===> ('Alex mAke love', 2),结果带有总共替换的个数
    
    
    #6
    obj=re.compile('d{2}')
    
    print(obj.search('abc123eeee').group()) #12
    print(obj.findall('abc123eeee')) #['12'],重用了obj
  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/guojieying/p/13426215.html
Copyright © 2011-2022 走看看