python对正则表达式的支持

之前,我们曾经介绍过正则表达式如何在介绍linux中grep命令的时候,顺带说明了正则表达式相关语法。

本文,我们来看下如何在python中实现对正则化的处理。

1. python中re模块的用法

python通过re模块实现对正则化的解析。具体常用函数,如下表所示。之外,如果函数范围的是正则表达式对象,对象同样调用这些自己的函数。

如果一个pattern需要重复使用,我们应该调用compile生成对应re对象。
在这里插入图片描述
其中前几个函数很常用。

2. 补充re的语法

除了在grep中提到的一些常用的字符含义之外,还有一些转义字符能够更加快速准确表达字符串的pattern

符号解释
\d直接匹配数字,与[0-9]同等效果,速记digiti
\w匹配所有的字母数字和下划线,速记word
\s匹配所有的空白,包括\t\n\r等等,速记space

同样的,如果上述符号字母为大写的话,含义就是取反的意思。
比如:
使用\D就可以匹配所有的不包含digital的字符串

符号解释
?:exp匹配exp但不捕获匹配的文本
?=exp匹配exp前面的位置
?<=exp匹配exp后面的位置
?!exp匹配后面不是exp的位置
?<!exp匹配前面不是exp的位置

应用实例

光说不练,等于白学。我们来练习下上述提及到的相关函数操作。

  1. 用户名必须由字母、数字或下划线构成且长度在6-20个字符之间,QQ号是5~12的数字且首位不能为0

    m1 = re.match(r'^\w{6,20}$', username)
    m2 = re.match('^[1-9]\d{4,11}$', qq)
    

    根据返回结果是否为none,可以判断匹配是否成功。

  2. 在一段文字中提取国内手机号码

    sentence = '''
    重要的事情说8130123456789遍,我的手机号是13512346789这个靓号,
    不是15600998765,也是110或119,王大锤的手机号才是15600998765。
    '''
    pattern = re.compile(r'(?<=\D)1[34578]\d{9}(?=\D)')
        # 查找所有匹配并保存到一个列表中
    mylist = re.findall(pattern, sentence)
    
    # 通过迭代器取出匹配对象并获得匹配的内容
    for temp in pattern.finditer(sentence):
        print(temp.group())
    
    # 通过search函数指定搜索位置找出所有匹配
    m = pattern.search(sentence)
    while m:
        print(m.group())
        m = pattern.search(sentence, m.end())
    

    分析:
    其中函数re.compile()编译()中的正则表达式并返回正则表达式对象。
    返回搜索结果对象的时候,有如下几种方式:

    • 使用re.findall()
    • 正则表达式对象调用finditer()函数,通过迭代器取出来
    • 正则表达式对象调用search()函数,通过指定位置找出匹配

    至于正则表达式中的撰写,我们需要注意其中(?<=\D)的应用,这表明我们是在非数字的字符串之后进行匹配工作。同样(?=\D)表明,我们是在非数字字符串之前进行匹配。通过这两项的控制,可以使得整个匹配工作限制在数字范围内。

  3. 替换字符串中的不良内容

    re.sub(r'cao|[草艹]|fuck|shit|傻[b比笔]','*',sentence,flag=re.IGNORECASE)
    

    re模块的正则表达式相关函数中都有一个flags参数,它代表了正则表达式的匹配标记,可以通过该标记来指定匹配时是否忽略大小写、是否进行多行匹配、是否显示调试信息等。如果需要为flags参数指定多个值,可以使用按位或运算符进行叠加,如flags=re.I | re.M

  4. 拆分字符串

    sentence_list = re.split(r'[,。, .]', poem)
    

    拆分之后,返回一个list

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值