zoukankan      html  css  js  c++  java
  • Python中正则表达式的巧妙使用

    字符串的匹配查询

    re模块中的findall函数可以对指定的字符串进行遍历匹配,获取字符串中所有匹配的子串,并返回一个列表结果。该函数的参数含义如下:

    findall(pattern, string, flags=0)
    pattern:指定需要匹配的正则表达式。
    string:指定待处理的字符串。
    flags:指定匹配模式,常用的值可以是re.I、re.M、re.S和re.X。re.I的模式是让正则表达式对大小写不敏感;re.M的模式是让正则表达式可以多行匹配;re.S的模式指明正则符号.可以匹配任意字符,包括换行符 ;re.X模式允许正则表达式可以写得更加详细,如多行表示、忽略空白字符、加入注释等。

    字符串的匹配替换

    re模块中的sub函数的功能是替换,类似于字符串的replace方法,该函数根据正则表达式把满足匹配的内容替换为repl。该函数的参数含义如下:
    sub(pattern, repl, string, count=0, flags=0)
    pattern:同findall函数中的pattern。
    repl:指定替换成的新值。
    string:同findall函数中的string。
    count:用于指定最多替换的次数,默认为全部替换。
    flags:同findall函数中的flags。

    字符串的匹配分割

    re模块中的split函数是将字符串按照指定的正则表达式分隔开,类似于字符串的split方法。该函数的具体参数含义如下:
    split(pattern, string, maxsplit=0, flags=0)
    pattern:同findall函数中的pattern。
    maxsplit:用于指定最大分割次数,默认为全部分割。
    string:同findall函数中的string。
    flags:同findall函数中的flags。

    实战案例

    如果上面的函数和参数含义都已经掌握了,还需要进一步通过案例加强理解,接下来举例说明上面的三个函数:

    # 导入用于正则表达式的re模块
    import re
    
    # 取出字符串string8中所有的天气状态
    string8 = "{ymd:'2018-01-01',tianqi:'晴',aqiInfo:'轻度污染'},{ymd:'2018-01-02',tianqi:'阴~小雨',aqiInfo:'优'},{ymd:'2018-01-03',tianqi:'小雨~中雨',aqiInfo:'优'},{ymd:'2018-01-04',tianqi:'中雨~小雨',aqiInfo:'优'}"
    # 基于正则表达式使用findall函数
    print(re.findall("tianqi:'(.*?)'", string8))
    
    # 取出string9中所有含O字母的单词
    string9  = 'Together, we discovered that a free market only thrives when there are rules to ensure competition and fair play, Our celebration of initiative and enterprise'
    # 基于正则表达式使用findall函数
    print(re.findall('w*ow*',string9, flags = re.I))
    
    # 将string10中的标点符号、数字和字母删除
    string10 = '据悉,这次发运的4台蒸汽冷凝罐属于国际热核聚变实验堆(ITER)项目的核二级压力设备,先后完成了压力试验、真空试验、氦气检漏试验、千斤顶试验、吊耳载荷试验、叠装试验等验收试验。'
    # 基于正则表达式使用sub函数
    print(re.sub('[,。、a-zA-Z0-9()]','',string10))
    
    # 将string11中的每个子部分内容分割开
    string11 = '2室2厅 | 101.62平 | 低区/7层 | 朝南 
     上海未来 - 浦东 - 金杨 - 2005年建'
    # 基于正则表达式使用split函数
    split = re.split('[-|
    ]', string11)
    print(split)
    # 分割结果的清洗
    split_strip = [i.strip() for i in split]
    print(split_strip)
    
    out:
    ['晴', '阴~小雨', '小雨~中雨', '中雨~小雨']
    ['Together', 'discovered', 'only', 'to', 'competition', 'Our', 'celebration', 'of']
    据悉这次发运的台蒸汽冷凝罐属于国际热核聚变实验堆项目的核二级压力设备先后完成了压力试验真空试验氦气检漏试验千斤顶试验吊耳载荷试验叠装试验等验收试验
    ['2室2厅 ', ' 101.62平 ', ' 低区/7层 ', ' 朝南 ', ' 上海未来 ', ' 浦东 ', ' 金杨 ', ' 2005年建']
    ['2室2厅', '101.62平', '低区/7层', '朝南', '上海未来', '浦东', '金杨', '2005年建']
    

    如上结果所示,在第一个例子中通过正则表达式"tianqi:'(.*?)'"实现目标数据的获取,如果不使用括号的话,就会产生类似"tianqi:'晴'", "tianqi:'阴~小雨'"这样的值,所以,加上括号就是为了分组,且仅返回组中的内容;

    第二个例子并没有将正则表达式写入圆括号,如果写上圆括号也是返回一样的结果,所以findall就是用来返回满足匹配条件的列表值,如果有括号,就仅返回括号内的匹配值;

    第三个例子使用替换的方法,将所有的标点符号换为空字符,进而实现删除的效果;

    第四个例子是对字符串的分割,如果直接按照正则 '[,。、a-zA-Z0-9()]' 分割的话,返回的结果中包含空字符,如 '2室2厅' 后面就有一个空字符。为了删除列表中每个元素的首尾空字符,使用了列表表达式,并且结合字符串的strip方法完成空字符的压缩。

  • 相关阅读:
    C++ 指针 new delete int*与string
    61.Android适配的那些P事(转)
    60.Android通用流行框架大全
    Android Studio配置指南总结
    大数据学习资源(下)
    大数据学习资源(上)
    59.Android开源项目及库 (转)
    Linux 简介
    7款应用最广泛的Linux桌面环境盘点
    58. Android一些开发习惯总结
  • 原文地址:https://www.cnblogs.com/kadycui/p/10792561.html
Copyright © 2011-2022 走看看