zoukankan      html  css  js  c++  java
  • python之常用正则表达式

    以下整理python中常用的正则符号,相信能够熟悉掌握这些正则符号,大部分字符串处理将会游刃有余。

    符号 含义 示例
    . 可以匹配任意字符,但不包含换行符' ' Pyt.on ->Pytmon
    转义符,一般用于保留字符串中的特殊元字符 10.3 ->10.3
    | 逻辑或 人a|A->人a或者人A
    [] 用于匹配的一组字符 m[aA]n ->man 或者 mAn
    d与D d匹配任意数字,D代表所有的非d 今天d号 ->今天3号
    s与S s匹配任意空白字符,S代表所有非s 你s好 ->你  好
    w与W w匹配字母数字和下划线,W代表所有非w Pwy ->Pay 或者 P3y  P_y
    * 匹配前一个字符0到无穷次 OK* ->O或者OK 或 OKK
    + 匹配前一个字符1到无穷次 OK+ ->OK或者OK 或 OKK
    匹配前一个字符0到1次 OK? ->O或者OK
    {m} 匹配前一个字符m次 OK{3} ->OKKK
    {m,n} 匹配前一个字符m到n次 OK{1,2} ->OK或者OKK


      

    另外 (.*?)用于分组,默认返回括号内的匹配内容,

    在Python开发爬虫过程中经常会遇到正则表达式,其中(.*?) 的使用概率较高,那么这个正则表达式到底什么意思呢?

    “.*?” 表示非贪心算法,表示要精确的配对。

    “.*”表示贪心算法,表示要尽可能多的匹配

    “()” 表示要获取括弧之间的信息。

    基于正则表达式完成字符串的查询,替换和分割操作,这些操作都需要导入re模块,并使用如下几个函数。

    1.匹配查询函数
    findall(pattern, string, flags=0)
    findall 函数可以对指定的字符串进行遍历匹配,获取字符串中所有匹配的子串,并返回一个列表结果。该函数的参数含义如下:
    pattern:指定需要匹配的正则表达式。
    string:指定待处理的字符flags:指定匹配模式,常用的值可以是re.I、re.M、re.S和re.X。

    re.I的模式是让正则表达式对大小写不敏感;

    re.M的模式是让正则表达式可以多行匹配;

    re.S的模式指明正则符号.可以匹配任意字符,包括换行符 ;

    re.X模式允许正则表达式可以写得更加详细,如多行表示、忽略空白字符、加入注释等。

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

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

    示例:

    import re

    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:'优'}"

    #取出字符串中所有的天气状态

    print(re.findall("tianqi:'(.*?)' '',string8))     #此处注意观察,(.*?)'  这里面使用的是精确匹配,当匹配到后面是' 号就停止 

    string9="I don't want to be someone that you're settling for. I don't want to be someone that anyone settles for. "

    print(re.findall('w*ow',string9,flags = re.I))     #此处留个缺陷" don't  you're "匹配出来不是我们想要的结果,用于思考

    ##out:

    ['don', 'someon', 'you', 'for', 'don', 'someon', 'anyon', 'for']

    string10 = '据路透社报道,由于土耳其军队离美军驻地已经过近,美军数架F-15战斗机和AH-64“阿帕奇”攻击直升机在土军阵地上方进行了威慑性飞行。'

    print(re.sub('[,。,“”a-zA-Z0-9()]','',string10))    #将标点符号,数字和字母删除

    out:

    据路透社报道由于土耳其军队离美军驻地已经过近美军数架-战斗机和-阿帕奇攻击直升机在土军阵地上方进行了威慑性飞行

    #将每一部分的内容分割开

    string11 = '2室2厅 | 101.62平 |低区/7层 | 朝南 上海未来 - 浦东-金杨 -2005年建'

    split =re.split('[-| ]',string11)      #[]列表内的所有符号作为分隔的标志

    print(split)

    split_strip = [i.strip() for i in split]

    print(split_strip )

    out:

    ['2室2厅', '101.62平', '低区/7层', '朝南', '上海未来', '浦东', '金杨', '2005年建']


  • 相关阅读:
    VS2010出现FileTracker : error FTK1011编译错误的解决办法
    win7笔记本 开启wifi共享 非常好用
    VS2010连接Mysql数据库图解详细教程
    vs2010打包winform程序详解
    九个让人难以置信的HTML5和JavaScript实验
    C#获取当前应用程序所在路径及环境变量
    winform加载时,为什么画图不执行了
    Asp_net与SQLserver一起打包部署安装图文教程
    CUDA编译问题
    llvm
  • 原文地址:https://www.cnblogs.com/tinglele527/p/11689546.html
Copyright © 2011-2022 走看看