python-re模块(92)

本文深入探讨了正则表达式的使用方法,包括基本的match、search、findall、finditer、sub和split函数,以及如何通过compile方法提高匹配效率。此外,还介绍了如何在文件中应用正则表达式进行模式匹配,以及如何使用Counter对象来统计匹配结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

>>> import re
>>> m = re.match('f..','food')  # 匹配到返回对象,匹配开头
>>> print(re.match('f..','seafood'))    #匹配不到返回None
None
>>> m.group()   #返回匹配的值
'foo'
>>> m = re.search('f..','seafood')  #匹配没有限制
>>> m.group()
'foo'
>>> re.findall('f..','seafood is food') #返回所有匹配项组成的列表
['foo', 'foo']

>>> result = re.finditer('f..','seafood is food')   # 返回匹配对象组成的迭代器
>>> for m in result:    # 从迭代器中逐个取出匹配对象
...     print(m.group())
...
foo
foo

>>> re.sub('f..','abc','fish is food')  #相当于匹配后替换
'abch is abcd'
>>> re.split('\.|-','hello-word-.tar.gz')   #切割,用.和-做切割符号
['hello', 'word', '', 'tar', 'gz']

>>> patt = re.compile('f..')    # 先把要匹配的模式编译,提升效率
>>> m = patt.search('seafood')  # 指定在哪个字符串中匹配
>>> m.group()
'foo'



#匹配文件中指定模式
import re
def count_patt(fname,patt):
    cpatt = re.compile(patt)
    result = {}

    with open(fname) as fobj:
        for line in fobj:
            m = cpatt.search(line)  #如果匹配不到,返回None
            if m:
                key = m.group()
                result[key] = result.get(key,0) + 1 #如果有值,返回值key,没有返回0

    return result

if __name__ == '__main__':
    fname = 'access_log'    # apache日志文件
    ip = '^(\d+\.){3}\d+'   # 日志开头的ip地址
    print(count_patt(fname,ip))
    br = 'Firefox|MSIE|Chrome'  # 日志中客户端浏览器
    print(count_patt(fname,br))




#模式匹配进阶写法

import re
from collections import Counter     # Counter对象是有序的,字典无序

class CountPatt:
    def __init__(self,fname):
        self.fname = fname

    def count_patt(self,patt):
        cpatt = re.compile(patt)
        result = Counter()

        with open(self,fname) as fobj:
            for line in fobj:
                m = cpatt.search(line)  #如果匹配不到,返回None
                if m:
                    result.update([m.group()])

        return result

if __name__ == '__main__':
    c = CounterPatt('access_log')
    ip = '^(\d+\.){3}\d+'
    br = 'Firefox|MSIE|Chrome'
    a = c.count_patt(ip)
    print(a)
    print(a.most_common(3))
    print(c.count_patt(br))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值