python中的re模块(正则表达式)

用途

  • 使用单个字符串来描述匹配一系列符合某个句法规则的字符串。
  • 是对字符串操作的一种逻辑公式。
  • 应用场景:处理文本和数据。
  • 正则表达式过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;否则匹配失败。

第一个正则表达式

导入re模块(下面的小例子前两句省略)

    # -*- coding:utf-8 -*-
    import re
    str = 're python'
    #r代表原字符串,不使用原字符串要注意转义
    p = re.compile(r're')
    print type(p)
    m = p.match(str)
    print m.groups()
    print m.span()
    print m.string

    输出结果
    <type '_sre.SRE_Pattern'>
    re                       
    (0, 2)                   
    re python                

单个字符匹配

字符匹配
.匹配任意字符(除了\n)
[…]例如[0-9a-zA-Z]匹配字符集
\d或\D匹配数字/非数字
\s或\S匹配空白/非空白字符
\w或\W匹配单词字符[a-zA-Z0-9]/(空格)非单词字符

注意下面这个转义的使用

    m = re.match(r'\[[\w]\]','[a]')
    print m.group()
    输出结果为:
    [a]  

多个字符匹配

字符匹配
*匹配前一个字符0次或者无限次
+匹配前一个字符1次或者无限次
匹配前一个字符0次或者1次
{m}/{m,n}匹配前一个字符m次或者m到n次
*?/+?/??匹配模式变为非贪婪(尽可能少匹配字符)

下面是上述匹配的一些小例子,有助于更好的理解多个字符匹配:

    m = re.match(r'[A-Z][a-z]','Aaaaa')
    print m.group()
    //Aa 

    m = re.match(r'[A-Z][a-z]*','Aaaaa')
    print m.group()
    //Aaaaa 

    m = re.match(r'[A-Z][a-z]+','Aaaaa')
    print m.group()
    //Aaaaa 

    #匹配python变量名(以下划线,字符开头)
    m = re.match(r'[_a-zA-Z]+[_\w]*','_ht8')
    print m.group()
    //_ht8 

    m = re.match(r'[_a-zA-Z]+[_\w]*','ATH')
    print m.group()
    //ATH 

    #匹配0-99
    m = re.match(r'[1-9]?[0-9]','99')
    print m.group()
    //99   

    m = re.match(r'[1-9]?[0-9]','19')
    print m.group()
    //19   

    m = re.match(r'[1-9]?[0-9]','9')
    print m.group()
    //9 

    #前一个字符没有0,所以后面的没有匹配
    m = re.match(r'[1-9]?[0-9]','09')
    print m.group()
    //0

    #匹配qq邮箱或者163邮箱
    m = re.match(r'[a-zA-Z0-9]{6,10}@163.com','ad12343@163.com')
    print m.group()
    //ad12343@163.com 

    m = re.match(r'[0-9][a-z]*?','1ad12343')
    print m.group()
    //1 

    m = re.match(r'[0-9][a-z]+?','1ad12343')
    print m.group()
    //1a    

    m = re.match(r'[0-9][a-z]??','1ad12343')
    print m.group()
    //1   

边界匹配

字符匹配
^匹配字符串开头
$匹配字符串结尾
\A或\Z指定的字符串匹配必须出现在开头有/结尾

匹配小例子:

    # -*- coding:utf-8 -*-
    import re

    #匹配163邮箱
    m = re.match(r'^[\w]{6,10}@163.com$','xuna123@163.com')
    print m.group()
    //xuna123@163.com

    m = re.match(r'\Axuna[\w]*','xunalove123')
    print m.group()
    //xunalove123

分组匹配

字符匹配
匹配左右任意一个表达式
(ab)括号中表达式作为一个分组
\引用编号为num的分组匹配到的字符串
(?P)分组起一个别名
(?P=name)引用别名为name的分组匹配字符串

演示小例子

    m = re.match(r'abc|d','abc')
    print m.group()
    //abc 

    #匹配0-99组成的任意字符串
    m = re.match(r'[1-9]?\d$','99')
    print m.group()
    //99  

    m = re.match(r'[1-9]?\d$','9')
    print m.group()
    //9 

    m = re.match(r'[1-9]?\d$|100','100')
    print m.group()
    //100  

    #匹配邮箱
    m = re.match(r'[\w]{4,6}?@(163|126|qq).com','xuna@qq.com')
    print m.group()
    //xuna@qq.com  

    m = re.match(r'<([\w]+>)\1','<book>book>')
    print m.group()
    //<book>book>  

    m = re.match(r'<([\w]+>)[\w]+</\1','<book>python</book>')
    print m.group()
    //<book>python</book> 

    m = re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)','<book>python</book>')
    print m.group()
    //<book>python</book>                         

re模块其他方法

match方法是用头开始匹配的。

  • search()方法
    从子字符串中查找匹配。

    # -*- coding:utf-8 -*-
    import re
    
    #查找字符串出现的数字
    str1 = 'imooc videonum = 1000'
    info = re.search(r'\d+',str1)
    print info.group()
    //1000
    
    str1 = 'imooc videonum = 2222'
    info = re.search(r'\d+',str1)
    print info.group()
    //2222                                     
    
  • findall()方法
    查找所有满足要求的匹配,并将结果以列表的形式返回。

    #查找字符串出现的数字
    str1 = 'c++=100, java=90, python=80'
    info = re.search(r'\d+',str1)
    print info.group()
    //100    
    
    str1 = 'c++=100, java=90, python=80'
    info = re.findall(r'\d+',str1)
    print info
    //['100', '90', '80']   
    
    #列表解析求和
    print sum([int(x) for x in info])                   
    //270  
    
  • sub()方法
    将字符串匹配正则表达式部分替换为其他值。

    # -*- coding:utf-8 -*-
    import re
    
    def add1(match):
        val = match.group()
        num = int(val)+1
        return str(num)
    
    #将数值加一
    str1 = 'imooc videonum = 1000'
    info = re.sub(r'\d+','1001',str1)
    print info
    //imooc videonum = 1001 
    
    str1 = 'imooc videonum = 9999'
    info = re.sub(r'\d+',add1,str1)
    print info
    //imooc videonum = 10000  
    
  • split()方法(常用)
    根据匹配分割字符串,返回分割字符串组成的列表。

    str1 = 'imooc:C C++ Java Python,C#'
    info = re.split(r' ',str1)
    print info
    //["imooc:c","c++","Java","Python","C#"]
    

更新:

  • re.compile():

Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先使用re.compile()函数,将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。
在寻找一个字符串中所有的英文字符:

import re
pattern = re.compile('[a-zA-Z]')
result = pattern.findall('ashdsfdhfvdvSHADGWEU1324358703475821')
print result
# ['a', 's', 'h', 'd', 's', 'f', 'd', 'h', 'f', 'v', 'd', 'v', 'S', 'H', 'A', 'D', 'G', 'W', 'E', 'U']   
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值