zoukankan      html  css  js  c++  java
  • 正则表达式 整理(w s d 点 贪婪匹配 非贪婪匹配 * + ? {} | [] ^ $  单词边界 分组、re.findall()、re.split()、re.search()、re.match()、re.compile()、re.sub())

    re.findall  匹配到正则表达式的字符,匹配到的每个字符存入一个列表,返回一个匹配到的所有字符列表
    一. 匹配单个字符
    import re
    # w 匹配所有字母、数字、下划线
    re.findall('w','abcd_123    *-')
    # 结果为:['a', 'b', 'c', 'd', '_', '1', '2', '3']
    
    
    # s 匹配所有不可见字符
    #  不可见字符有:
     	 空格
    re.findall('s','abcd 
    	df21  ')
    # 结果为:[' ', '
    ', '	', ' ', ' ']
    
    
    # d 匹配所有数字
    re.findall('d','a1bc3 4d 
    	df21  ')
    # 结果为:['1', '3', '4', '2', '1']
    
    
    # . 匹配
    换行符以外的所有可见和不可见字符
    re.findall('.', 'c3 d
    	d1')
    # 结果为:['c', '3', ' ', 'd', '	', 'd', '1']
    二. 匹配多个字符
    #匹配多个字符:* + ?
    import re
    #  * 匹配0或n次
    re.findall('d*', '1a23')
    # 结果为:['1', '', '23', '']
    
    
    #  + 匹配1或n次
    re.findall('d+', '1a23')
    # 结果为:['1', '23']
    #前面2个是叫贪婪匹配
    
    
    #  ? 匹配0或1次
    re.findall('d?', '1a3')
    # 结果为:['1', '', '3', '']
    # 这个叫非贪婪匹配
    三. 匹配指定范围字符
    # {m,n} 匹配最少m次,最多n次
    # {m} 只匹配m次的
    # {,n}  匹配最大n次,最小次数不限
    # {m,}  匹配最小m次,最大次数不限
    re.findall('d{2,4}', '1a33g134nn12345')
    # 结果为:['33', '134', '1234']
    re.findall('a{3}', '1aaa3*G+1aaaan#b')
    # 结果为:['aaa', 'aaa']
    
    
    # | 匹配 或 语法的字符
    re.findall('1|23|4', '1a33g134nn12345')
    # 结果为:['1', '1', '4', '1', '23', '4']
    
    
    # [ ] 匹配括号内的字符(只匹配单个)
    re.findall('[123]', '1a33g134nn12345')
    # 结果为:['1', '3', '3', '1', '3', '1', '2', '3']
    re.findall('[0-9a-zA-Z]', '1a3*G+1n#')
    # 匹配0到9或者a到z或者A到Z单个字符
    # 结果为:['1', 'a', '3', 'G', '1', 'n']
    
    
    # ^x 行首匹配
    # x$ 行尾匹配
    re.findall('^1', '1a3*G+1n#b')
    re.findall('b$', '1a3*G+1n#b')
    # 结果为:['1']     
    # 结果为:['b']
    四. 一些比较不常见的匹配
     单词边界,重点理解在于‘边界’二字,‘单词’代表匹配的字符串

      划定边界基本原则:比如表达式为 '单词'   的意思就是匹配字符串为‘单词’,单词两边需要存在满足条件的边界才能匹配成功。匹配失败结果肯定是空列表,匹配成功结果就是匹配的单词字符串列表。

      在哪边就限制哪边的匹配。

      匹配成功的边界满足条件跟匹配单词字符串有关联,双方是同一类型则失败,不同类型则成功

    # 正则表达式中的可以用匹配目标单词字符串,加设限制匹配边界
    # 单词的 前边界:'单词'
    #     后边界:'单词'
    #     前和后边界:'单词'
    # 在的使用中有这样几点是需要格外注意的
    # 0. 本身的含义就有转义字符串的作用,要用字符边界就得将其原始含义去掉,所以需要加r或者\b(两个不能一起用)
    
    # 1. 单词字符串能否匹配成功是有规律的:
    # 如果是a-z,A-Z,0-9,则匹配边界为非字母数字才能匹配成功。
    # 如果是非字母数字,则匹配边界为a-z,A-Z,0-9才能匹配成功。
    # 如果是两个混在一起,判断标准为那个挨着最近的字符作为判断标准,如果是字母数字,则匹配边界为非字母数字才成功,反之亦然。
    import re
    s='aa abcperty/-aa '
    res1=re.findall(r'abc',s)    # 结果:['abc'] 单词为字母,左匹配边界为非字母数字,匹配成功
    res2=re.findall(r'abc',s)    # 结果:[]      单词为字母,右匹配边界为字母,匹配失败
    print(res1,res2)
    
    s='aa@# perty/-aa '
    res3=re.findall(r'@#',s)     # 结果:['@#']  单词为非字母数字,左匹配边界为字母,匹配成功
    res4=re.findall(r'@#',s)     # 结果:[]      单词为非字母数字,右匹配边界为空格(非字母数字),匹配失败
    print(res3,res4)
    
    s='aa@a perty/-aa '
    res5=re.findall(r'@a',s)     # 结果:['@a']  单词为混合,@挨着,单词以非字母数字为标准,左匹配边界为字母,匹配成功
    res6=re.findall(r'@a',s)     # 结果:['@a']  单词为混合,a挨着,单词以字母数字为标准,右匹配边界为空格,匹配成功
    print(res5,res6)
    
    # 2.字符串的首尾边界默认定义为 非字母数字,所以如果匹配的单词字符串在首尾,则匹配字母数字则会成功,匹配非字母数字失败。
    s= 'abcd@'
    res7 = re.findall(r'a',s)    # 结果:['a'] 单词为字母,左匹配边界为首,默认定义为非字母数字,匹配成功
    res8 = re.findall(r'@',s)    # 结果:[] 单词为非字母数字,右匹配边界为尾,默认定义为非字母数字,匹配失败
    print(res7,res8)
    五. 分组

    用小括号表示,分组后的正则表达式优先匹配并返回括号内的值

    六. re模块常用方法
    re.search   

    查找,匹配成功返回第一匹配的字符串,结果为封装的对象(注意search返回的是个对象,.group() 后得到的是字符串不是列表),失败返回None

    import re
    s = 'welcome world hello python'
    res = re.search('hello', s)
    print(res)
    print(res.group())
    
    # 结果:
    <_sre.SRE_Match object; span=(14, 19), match='hello'>
    hello
    re.match

    匹配,在行首匹配字符串,方法同search,区别在于,match在行首匹配,search是从前到后全部查找匹配。

    s = 'hello welcome world hello python'
    res=re.match('hello', s)
    print(res)
    print(res.group())
    res1=re.match('welcome',s)
    print(res1)
    
    # 结果:
    <_sre.SRE_Match object; span=(0, 5), match='hello'>
    hello
    None
    re.split 

    用匹配成功的字符串作为切割符,进行原字符串的切割,返回一个切割后的列表。匹配失败,直接返回原字符串,不做任何切割处理

    匹配成功完成切割
    s1 = 'hello welchhome world hello python'
    res=re.split('h.+?o',s1)
    print(res)
    
    # 结果:
    ['', ' welc', 'me world ', ' python']
    
    匹配不成功,返回原字符串。不做任何切割处理
    s1 = 'hello welchhome world hello python'
    res0=re.findall('json',s1)
    print(res0)
    res=re.split('json',s1)
    print(res)
    
    # 结果:
    []
    ['hello welchhome world hello python']
     re.compile

    将正则表达式封装成对象,用于重复使用该表达式。使用方法看例子:

    s1 = 'hello welchhome world hello python'
    pat=re.compile('h.+?o')
    res2=pat.findall(s1)
    print(res2)
    
    # 结果:
    ['hello', 'hho', 'hello']
    re.sub

    替换,重组(group(1)、group(2)...group(n)用1  2  ... 来替换,进行字符串的重新组合(前面要加r防止其转义)

    s='<我的博客地址https://www.cnblogs.com/oldboy2019/,欢迎大家来访问、交流,欢迎大家一起探讨python!ohye!>'
    # pat=re.compile(r'<(.+)http://(www.+/),.+>')
    pat=re.compile(r'<(.+)http.+(www.+/),(.+?)([a-z]+)!(.+)!>')
    print(pat.findall(s))
    res=pat.sub(r'2
    这是1,4,53',s)
    print(res)
    
    # 结果:
    [('我的博客地址', 'www.cnblogs.com/oldboy2019/', '欢迎大家来访问、交流,欢迎大家一起探讨', 'python', 'ohye')]
    www.cnblogs.com/oldboy2019/
    这是我的博客地址,python,ohye欢迎大家来访问、交流,欢迎大家一起探讨

    #注意,这里第二个打印我在前面加了个原义字符r,但是里面 还是转义成了换行,很奇怪,这个地方欢迎一起交流,为何会出现这种情况呢?
  • 相关阅读:
    【贪心】POJ1017:Packets
    【贪心】POJ2393:Yogurt factory
    【贪心】POJ3190:Stall Reservations
    【递归】地盘划分
    【递归与递推】青蛙过河
    【搜索】POJ1242:Rescue
    单词方阵(dfs)
    反向因子Inverse Factorial
    P1604 B进制星球
    抵制克苏恩(记忆化搜索)
  • 原文地址:https://www.cnblogs.com/suguangti/p/10800192.html
Copyright © 2011-2022 走看看