• Python(re模块,正则)


     day18

    正则表达式用处?

    匹配 字符串

     1 s = 'hello world'
     2 
     3 print(s.find('llo'))#第一个的位置
     4 
     5 ret = s.replace('ll','xx')
     6 print(ret)
     7 
     8 print(s.split(' '))
    

    执行结果

    2
    hexxo world
    ['hello', 'world']
    
    Process finished with exit code 0

    以上字符串提供的是完全匹配 模糊匹配,以上方法不可行,需正则表达式
     1 import re
     2 
     3 ret = re.findall('ww{2}l','hello world')  # ['worl']
     4 print(ret)
     5 
     6 ret1 = re.findall('alex', 'aalexsbvesalexfwfawea')#完全匹配,但是没必要   ['alex', 'alex']
     7 print(ret1)
     8 print(' ')
     9 #元字符
    10 
    11 # . 代指所有符号,除换行符
      通配符 .
    12 reta = re.findall('w..l', r'hello w  ld') #只能代指任意一个字符 ['w l']
    13 print(reta)
    14 print(' ')
    15 # ^
    16 retb = re.findall('^h...o', 'hjasdadsdhello') #只在开始匹配,尽管后面有hello []
    17 print(retb)
    18 print(' ')
    19 # $
    20 retc = re.findall('a..x$','asfsacsxjaoox') #只在最后匹配 ['aoox']
    21 print(retc)
    22 print(' ')
    23 # * 重复匹配
    24 retd = re.findall('al.*i', 'sanvjalexli')  #[0,+oo] 匹配0到多次  ['alexli']
    25 print(retd)
    26 print(' ')
    27 # + 重复匹配
    28 rete = re.findall('ab+', 'sanvjah')  #[1,+oo] 匹配1到多次,a后面必须接上b  []
    29 print(rete)
    30 print(' ')
    31 # ? [0,1]
    32 retf = re.findall('a?b', 'aaabhghabfb') #0个或者1个a,后面接b  ['ab', 'ab', 'b']
    33 print(retf)
    34 print(' ')
    35 # {}
    36 retg = re.findall('a{5}b', 'vaaaaaab') #5个a  ['aaaaab']
    37 print(retg)
    38 reth = re.findall('a{1,3}b', 'vaab') #贪婪匹配,设定一个范围,按最多的取  ['aab']
    39 print(reth)

    执行结果

    ['worl']
    ['alex', 'alex']
     
    ['w  l']
     
    []
     
    ['aoox']
     
    ['alexli']
     
    []
     
    ['ab', 'ab', 'b']
     
    ['aaaaab']
    ['aab']
    
    Process finished with exit code 0
    结论:*等于{0,正无穷} +等于{1,正无穷} ?等于{0,1}

     1 # 字符集
     2 reta = re.findall('a[c,d]x', 'adx')   # ['adx']
     3 print(reta)
     4 
     5 retb = re.findall('[a-z]', 'adx') # a到z都可以匹配   ['a', 'd', 'x']
     6 print(retb)#['a', 'd', 'x']
     7 
     8 # [] 取消元字符的特殊功能, 但是 ^ - 例外
     9 retc = re.findall('[w,*]', 'wad*') # *为一个普通字符      ['w', '*']
    10 print(retc)
    11 
    12 #但是 ^ - 例外
    13 retd = re.findall('[1-9,a-z,A-Z]', '12sfsA') # *为一个普通字符   ['1', '2', 's', 'f', 's', 'A']
    14 print(retd)
    15 
    16 #  ^放在[]中意味着去反
    17 rete = re.findall('[^s,A]', '12sfsA') # 除了s和A  ['1', '2', 'f']
    18 print(rete)
    19 
    20 
    21 #  
    22 # 反斜杠后面跟元字符去除特殊功能
    23 # 反斜杠后面跟普通字符实现特殊功能
    24 
    25 print(re.findall('d{11}', 'scbdhsh3123124326543')) # d数字[0-9]   ['31231243265']
    26 
    27 print(re.findall('sasd', 'fak asd')) # s匹配任何空白字符   [' asd']
    28 
    29 print(re.findall('w', 'scbhsh 12432'))# w字母数字 ,相当于a-zA-Z0-9   ['s', 'c', 'b', 'h', 's', 'h', '1', '2', '4', '3', '2']
    30 
    31 print(re.findall(r'I', 'hello, I am LI$T'))# 匹配一个特殊字符的边界    ['I', 'I']
    32 
    33 
    34 #匹配出第一个满足的结果
    35 retf = re.search('sb', 'scbdsbhshsb')# 对象
    36 print(retf) #<_sre.SRE_Match object; span=(4, 6), match='sb'>
    37 print(retf.group())
    38 
    39 
    40 retg = re.search('a.g', 'a.gj').group()# 此时的点并不是通配符,只是一个 .    a.g
    41 print(retg)

    执行结果:

    ['adx']
    ['a', 'd', 'x']
    ['w', '*']
    ['1', '2', 's', 'f', 's', 'A']
    ['1', '2', 'f']
    ['31231243265']
    [' asd']
    ['s', 'c', 'b', 'h', 's', 'h', '1', '2', '4', '3', '2']
    ['I', 'I']
    <_sre.SRE_Match object; span=(4, 6), match='sb'>
    sb
    a.g
    
    Process finished with exit code 0

    ()

     1 import re
     2 ret = re.findall(r'\d', 'abcde')# r 代表原生字符串,将\d传给re,而非python解释器
     3 print(ret)
     4 
     5 m = re.search(r'blow', 'blow')
     6 print(m)
     7 
     8 print(re.search('(as)+', 'adcdasasas').group())#asas   as为一个整体,匹配多个as
     9 
    10 print(re.search('(as)|3', 'as3').group()) #

    执行结果

    ['\d']
    <_sre.SRE_Match object; span=(0, 4), match='blow'>
    asasas
    as
    
    Process finished with exit code 0
    1 import re
    2 ret = re.findall("www.(w+).com", "www.baidu.com")  #() 组的概念
    3 print(ret)

    执行结果:

    ['baidu']
    
    Process finished with exit code 0

    正则表达式的方法:

    1.findall():所有结果都返回一个列表

    2.search():返回匹配到的一个对象,对象可调用group()返回结果

    3.match():只在字符串开始进行匹配

     1 import re
     2 eta = re.match('asd', 'fhdsasd')#只在字符串开始进行匹配  None
     3 print(reta)
     4 
     5 retb = re.split('[j,s]', 'sdjksal')# 注意空字符  ['', 'd', 'k', 'al']
     6 print(retb)
     7 
     8 retc = re.sub('a..x', 's.....b', 'ffghalexbn') # 替换  ffghs.....bbn
     9 print(retc)
    10 
    11 retd = re.compile('.com')#规则被编译到对象, 点.不再是通配符
    12 rete = retd.findall('adcdscd.com')#对象中已经有规则
    13 print(rete)

    执行结果:

    None
    ['', 'd', 'k', 'al']
    ffghs.....bbn
    ['.com']
    
    Process finished with exit code 0

    参考:

    http://www.cnblogs.com/yuanchenqi/articles/5732581.html

  • 相关阅读:
    [改善Java代码]使用构造块精炼程序
    [改善Java代码]若有必要,使用变长数组
    [改善Java代码]警惕数组的浅拷贝
    [改善Java代码]在明确的场景下,为集合指定初始容量
    [改善Java代码] 枚举项数量限定为64个以内
    [改善Java代码]多种最值算法,适时选择
    [改善Java代码]推荐使用枚举定义常量
    [改善Java代码]性能考虑,数组是首选
    [改善Java代码]用偶判断,不用奇判断
    [改善Java代码]break万万不可忘
  • 原文地址:https://www.cnblogs.com/112358nizhipeng/p/9578424.html
Copyright © 2020-2023  润新知