• 正则表达式:文本处理中的瑞士军刀


    正则表达式是用于提取字符串规律的规则,通过特定语法表达,以匹配符合该规律的字符串。它具有通用性,不仅适用于Python,也可用于其他编程语言。

    下面我用Python的re模块来进行实战演示:(记得import re

    re模块的主要功能有匹配、搜索、分割、匹配和替换......

    re模块的方法分为两大类:

    1. 直接使用re模块的方法
    2. 使用正则表达式对象

    菜鸟营地

    findall

    1. findall(pattern,string[,flags])
    2. # pattern:指定的匹配模式 string:输入的字符串
    3. # flags:可选参数(用于表示匹配过程中的一些选项)
    4. # 该函数返回值是一个列表

    常用pattern 

    ' . ':通配符,代表任意字符(\n除外),一个点一个字符,例如:

    1. ret = re.findall('m...e', 'cat and mouse')
    2. print(ret)#['mouse']

    ' * ':重复,运行*之前的一个字符重复多次,例如:

    1. ret1 = re.findall('o*i', 'oooooi and bye')
    2. print(ret1)#['oooooi']

    ' ? ':也是重复匹配,允许?之前的字符只能重复0次或者1次,例如:

    1. ret2 = re.findall('ca?t', 'ct cat caat caaat')
    2. print(ret2)#['ct', 'cat']

    + ':也是重复匹配,但是至少重复1次,不能是0次,例如:

    1. ret2 = re.findall('ca+t', 'ct cat caat caaat')
    2. print(ret2)#['cat', 'caat', 'caaat']

    {} ':也是重复匹配,但是匹配次数可以自行设置,次数可以是一个数或者范围,例如:

    {m}匹配前一个字符出现m次
    {m,}匹配前一个字符至少出现m次
    {m,n}匹配前一个字符出现m-n次
    1. ret3 = re.findall('ca{2}t', 'ct cat caat caaat caaaat')
    2. print(ret3)#['caat']
    3. ret3 = re.findall('ca{2,}t', 'ct cat caat caaat caaaat')
    4. print(ret3)#['caat', 'caaat', 'caaaat']
    5. ret3 = re.findall('ca{2,3}t', 'ct cat caat caaat caaaat')
    6. print(ret3)#['caat', 'caaat']

    ' ^ ':必须从字符串的起始位置开始匹配,例如:

    1. ret5 = re.findall('^m...e', 'cat and mouse')
    2. print(ret5)#[]
    3. ret6 = re.findall('^m...e', 'mouse and cat')
    4. print(ret6)#['mouse']

    ' $ ':值从最后开始匹配,例如:

    1. ret7 = re.findall('m...e$', 'cat and mouse')
    2. print(ret7)#['mouse']

    ' | ':两个模式进行或的匹配,例如:

    1. ret8 = re.findall('cat|mouse', 'cat and mouse')
    2. print(ret8)#['cat', 'mouse']

    ' \ ':转义字符,例如:

    1. ret9 = re.findall('/^m...e', '^mouse and cat')
    2. print(ret9)#[]
    字符功能
    \d匹配数字,即0-9
    \D匹配非数字
    \s匹配空白,即空格,tab键
    \S匹配非空白
    \w匹配单词、字符
    \W匹配非单词字符
    [ ]匹配[ ]中列举的字符的其中一个
    1. ret = re.findall('12[qaz]','13qwe12qwe')
    2. print(ret)#['12q']

    [^789]:不匹配789中的一个,^是非的意思 

    1. ret = re.findall('12[^qaz]','13qwe12pqwe')
    2. print(ret)#['12p']

     

    \b匹配一个单词的边界(字母数字和非字母数字的边界)
    \B匹配非单词的边界
    1. ret = re.findall('oi\\b','oi.55llhihibye')
    2. print(ret)#['oi']

    即oi的右边不能有字母或数字! 

    1. ret = re.findall('oi\\B','oi55llhihibye')
    2. print(ret)#['oi']

    即oi的右边必须有字母或数字! 

    常用flags 

    •  re.IGNORECASE:缩写re.I                表示忽略大小写
    1. ret = re.findall('m...e', 'cat and MOUSE')
    2. print(ret)#[]
    3. ret = re.findall('m...e', 'cat and mouse',re.IGNORECASE)
    4. print(ret)#['mouse']
    •   re.VERBOSE:缩写re.X                     表示忽略模式中的空格,并可以使用#注释代码,提高    可读性
    1. phoneRegex = re.compile(r'''( (\d{3}|\(\d{3}\))? # area code
    2. (\s|-|\.)? # separator
    3. \d{3} # first 3 digits
    4. (\s|-|\.) # separator
    5. \d{4} # last 4 digits
    6. (\s*(ext|x|ext.)\s*\d{2,5})? # extension
    7. )''',re.VERBOSE)

    可以按意义,分部分写。一部分写一行,后面加上注释。执行时,注释会被忽略。同时,多余的空白也会被忽略。如果用以前的方式写,则不小心写的空白,可能会改变正则表达式的意义 

    •   re.DOTALL:缩写re.S                     表示使元字符也匹配换行符
    1. a = """hhhhoirerej
    2. jjjioioeer"""
    3. print(re.findall(r'oi.*oi',a))#[]
    4. print(re.findall(r'oi.*oi',a,re.S))#['oirerej \njjjioi']

    match

    re.match(pattern, string)# pattern  匹配的正则表达式 string  要匹配的字符串

    re.match()必须从字符串开头匹配!match方法尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。 

    1. a = re.match('bbbtest','bbbtestasdtest')
    2. print(a) #返回一个匹配对象
    3. print(a.group()) #返回test,获取不到则报错 bbbtest
    4. print(a.span()) #返回匹配结果的位置,左闭右开区间 (0, 7)
    5. print(re.match('test','atestasdtest')) #返回None None

    search 

    匹配整个字符串,并返回第一个成功的匹配

    sub

    替换指定的字符串 

    1. re.sub(pattern,repl,string)
    2. #pattern:要替换的数据 repl:替换成什么 string:源数据
    print(re.sub('cnm','hhhh','cnmcnms'))#hhhhhhhhs

    split 

    对字符串进行分割,并返回一个列表

    1. s = "https:bbbsssd.com"
    2. print(re.split("\.",s)) #以.号进行分割['https:bbbsssd', 'com']
    3. print(re.split(":|\.",s)) #以:或者.进行分割['https', 'bbbsssd', 'com']
    4. print(re.split(r",|:|-|%|\.",s)) #找不到的分隔符就忽略['https', 'bbbsssd', 'com']

    贪婪 

    python里的数量词默认是贪婪的,总是尝试尽可能的匹配更多的字符。python中使用?号关闭贪婪模式 

    1. print(re.match(r"qq\d+","qq666666")) #会尽可能多的去匹配\d
    2. print(re.match(r"qq\d+?","qq66666777")) #尽可能少的去匹配\d

    华山论剑

    提取图片地址

    1. import re
    2. a=''
    3. re = re.search("src=\"https.*\"",a)
    4. print(re.group())#src="https://act-webstatic.mihoyo.com/hk4e/e20200928calculate/item_icon_u8f88e/32ea78b3df5ba600611c015475e648a4.png?x-oss-process=image%2Fresize%2Cw_104%2Fquality%2CQ_90%2Fformat%2Cwebp" class="recommend-popup__item-img"
    5. #因为python是贪婪的
    6. a=''
    7. re = re.search(r'src="https\S+"', a)
    8. if re:
    9. print(re.group())#src="https://act-webstatic.mihoyo.com/hk4e/e20200928calculate/item_icon_u8f88e/32ea78b3df5ba600611c015475e648a4.png?x-oss-process=image%2Fresize%2Cw_104%2Fquality%2CQ_90%2Fformat%2Cwebp"

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    WPF绘图(Path剪裁)
    反射工具类 guava Apache spring
    Appium进行APP自动化测试
    『期末复习』计算机中常用术语
    Go语言类库-context
    RabbitMQ 26问,基本涵盖了面试官必问的面试题
    阿里云大数据助理工程师认证考试考什么内容?
    Go编程规范
    【RuoYi-Cloud项目研究】【ruoyi-gateway模块】Spring Gatewaye和Sentinel实现网关流控
    深度学习——动物数据集大合集(附下载地址)
  • 原文地址:https://blog.csdn.net/m0_62407354/article/details/133945794