Python基础--正则表达式

本文详细介绍Python中re模块的正则表达式使用方法,包括元字符、字符集、分组、转义字符等核心概念及其应用实例。
re模块(正则表达式):
 *元字符:不是普通的字符,是特殊字符!
  1:通配符:. 可以匹配除了换行符以外的任意一个字符
   例子:re.findall('l..e',"abcloveabc") #匹配字符串中以l开头以e结尾且长度为4的字符串,若有多个则以列表的形式返回
  2:^ :以什么开头,只能从str开头进行匹配
   例子:re.findall('^l..e',"loveabc") #注意:只能从str的开头进行匹配,且^前不能加其他元字符
  3:$:以什么结尾,只能从str结尾进行匹配
   例子:re.findall('p.z$',"abcpzz") #返回结果:["pzz"]
  4: *:匹配字符重复0-无穷次的字符串
   例子: re.findall('p*','abpcppdp') #返回结果['','','p','','pp','','p']
              re.findall('pz*',"abcpzzzz")#返回结果是['pzzzz']
              re.findall('pz*',"abcp") #返回结果是:['p']
     +:匹配字符重复1-无穷次的字符串 (要求匹配的字符重复次数至少是1)
     例子:re.findall('pz+',"abcp") #返回结果是:[]
     ?:匹配字符重复0-1的字符串
     {}:打括号里面可以给定任意数值,指定字符的重复次数
    {0,}-->*
    {1,}-->+
    {0,1}-->?
    {int} :重复的次数固定为int次
   注意:上述匹配重复次数的元字符,会按照最多次进行匹配!也就是所谓的"贪婪匹配"!如果要修改这种默认的
      贪婪匹配,可以再匹配规则的后面加上?就把规则变成了惰性匹配,即匹配最少的重复次数!
  5.字符集:[]
   *re.findall('x[yz]',"xyabxzxyz") #打印结果:['xy', 'xz', 'xy']
   *[]里面的元字符会失去其本身的功能,变成一般字符!除了几个特殊的字符:
    a-z:a到z的所有字符;^a-z:不是a到z的所有字符;\:转义
    re.findall('X[a-z]*','Xawqqwe') #打印结果:['Xawqqwe']
    re.findall('X[^a-z]*',"Xawqqwe") #打印结果:['X']
    re.findall('\([^()]*\)','(12-2*(4-3*(5-3))') #打印结果:['(5-3)']
     注意:()元字符,所以要转义;[]里面的()就不需要再通过\进行转义了。匹配规则是,以(开头,以)结尾,且
        中间没有()了,并且括号里面的元素个数为*!目标就是找到最里面的括号内容
  6.转义字符:\ 转义字符比较绕,注意理解!!!
   *让没有意义的字符变得有意义
   \d-->[0-9]
   \D-->[^0-9]
   \s:匹配空白字符
   \S:匹配非空白字符
   \w-->[0-9a-zA-Z]
   \W:-->[^0-9a-zA-Z]
   \b:匹配特殊字符边界 如:#,&等
   *让有意义的字符变的没意义;例如让元字符失去特殊功能变成一般字符 \*,\.等等
   例子:
    import re
    print(re.findall('I\\b',"I am pzz!")) #\\b会先交给python解释器进行转义-->\b,然后给到re模块,re认的\b不会再转义
    print(re.findall(r'I\b',"I am pzz!"))#加上一个r,规则不会交给python解释器,而是直接给到re模块执行
    
    import re
    print(re.findall(r'I\\z',"I\zm")) #\\把转义字符转义成不同字符\,然后前面加上r,就是把I\z普通字符传给re进行匹配
    print(re.findall('I\\\\z',"I\zm") #\\\\交给python解释器转义\\,之后交给re,re转义\\变成不同字符\,之后进行匹配
    上述2个方法的返回值都是:['I\\z'] ,并不是['I\z'].这是因为规则传给python解释器进行转义之后再给到re模块转义,然后匹配到str中的
    对应字符串,之后把符合规则的串返还给python解释器,python又把\做了一次转义,所以返回结果是\\双反斜杠的。这里面
    做简单了解,匹配除结果就好了!
  7.或:| (str1|str2 :匹配str1或str2,注意这里面字符串长度不一定是1)
   re.findall('Ia|m',"Iampzz!") #返回结果是:['Ia', 'm']
  8:分组:()
   *re.findall("(abc)+","abcabc") #打印结果:['abc']
    如果不同小括号进行分组,只会匹配+前面的一个字符,而加上之后可以对()里面的字符串进行+规则的匹配!由于()的
    优先级问题,优先匹配()里面的内容,所以返回结果是['abc'].可以通过"(?:abc)+"取消优先级,这样返回结果是
    ['abcabcabc'].
   *'(?P<key>匹配规则)'
   re.search('(?P<name>[a-z]+)(?P<age>\d+)','alex12pzz13').group("name") #打印结果:'alex
   re.search('(?P<name>[a-z]+)(?P<age>\d+)','alex12pzz13').group("age") #打印结果:'12'
   注意:?P<name> :除了name可以任意,其他的都是固定格式。类似字典,通过key拿到对应分组的数值.如果不用上述格式
     也可以:
     re.search('([a-z]+)(\d+)','alex12pzz13').group() #打印结果:‘alex12’
    第一方法可以通过key拿到不同分组的数值,而这个方法会把不同分组数值全打印!推荐第一种
  
 *re下的方法:
  *re模块的search与findall方法区别:findall方法会把符合规则的字符串以列表的形式返回;而search会把符合规则的字符串
   以对象的形式返回,通过group方法获得字符串,而且search只会匹配第一个,不会匹配多个!
  *re.match(str1,str2):只会从字符串的开头按照规则进行匹配且只会匹配一个结果,并且返回值是对象。
        通过group方法获得匹配到的字符串(类似在search方法的规则前加^)
  *re.split():
   print(re.split(" ","abc abc abc")) #按照空格分割字符串
   print(re.split("[| ]","abc abc|abc")) #按照空格或是|分割字符串
   print(re.split("[ab]","abcabcabc")) #如果[]里面的字符在匹配字符串的前后都有则留下对应数量的'',如果在中间留下(个数-1)个''
   注意:规则的字符串前后不要乱加空格,否则会发生意想不到的错误!
  *re.sub(规则,str1,str2,int):把str2中符合规则的字符串用str1替换掉int次!返回结果是:替换后的字符串
   re.subn(规则,str1,str2):返回结果是:(替换后的字符串,替换的次数)
  *obj=re.compile(规则)
   obj.findall(str)
   上述两行代码等价于re.findall(规则,str)!上述方式的优势就是如果规则被多次使用,则这个方式方便
  *re.finditer(规则,str):与findall方法一致,只是finditer返回值是可迭代对象,通过调用next方法迭代元素,而这个元素
         是一个对象,在通过group方法获得符合规则的字符串!
  *如果规则中存在(),则优先返回()里面匹配的内容;也可以通过(?:)去掉优先级!
   re.findall("www\.(baidu|360)\.com","adfawww.baidu.comad") #返回结果:['baidu']
   re.findall("www\.(?:baidu|360)\.com","adfawww.baidu.comad")#返回结果:['www.baidu.com']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值