• Python_基础_(正表达式)


    一,正则表达式

     普通的匹配都为完全匹配

    正则表达式为模糊匹配

    ## 元字符

      . ^ $ * + ? {} [] ()

    ### .:一个点代表匹配一个字符
    >>> re.findall("he..o","abchelloabc")
    ['hello']
    >>>

    ### ^:在字符串的开头进行匹配,
    >>> re.findall("^hello","ahello")
    []
    >>> re.findall("^hello","helloabc")
    ['hello']
    >>>

    ### $:以什么进行结尾
    >>> re.findall("hello$","abchello")
    ['hello']
    >>>

    ### *:按着挨着的字符进行重复(0~无穷)
    >>> re.findall("o*","helloworldoooooaooo")
    ['', '', '', '', 'o', '', 'o', '', '', '', 'ooooo', '', 'ooo', '']
    >>>

    ### +:按着挨着的字符进行重复(1~无穷) 至少有一个,贪婪匹配
    >>> re.findall("o+","helloworldoooooaooo")
    ['o', 'o', 'ooooo', 'ooo']
    >>>
    >>> re.findall("hello+","helloworldoooooaooo")
    ['hello']
    >>>

    ### ?:按着挨着的字符进行重复(1~0)    ,最多为1个
    >>> re.findall("o?","helloworldoooooaooo")
    ['', '', '', '', 'o', '', 'o', '', '', '', 'o', 'o', 'o', 'o', 'o', '', 'o', 'o', 'o', '']
    >>>
    >>> re.findall("hello?","helloworldoooooaooo")
    ['hello']
    >>>

    {}:可以表示前面三种的情况
        {0,} == *
        {1,} == +
        {0,1} == ?
        
        {6}表示可以重复6次
        {1,6}表示可以重复1~6中任意的次数

    ### 将贪婪匹配变成惰性匹配,
    ### 在原本*号的后面加上一个?,将贪婪匹配变成惰性匹配
    >>> re.findall("hello*?","abchelloabc")
    ['hell']
    >>>
    >>> re.findall("hello+?","abchelloabc")
    ['hello']
    >>>

    # 元字符集[]
    >>> re.findall("x[yz]","xyssssssxzjxpjjjj")
    ['xy', 'xz']
    >>>
     
    >>> re.findall("x[yzp]","xyssssssxzjxpjjjj")
    ['xy', 'xz', 'xp']
    >>>

    
    注:元字符集中的符号大多数为普通符号 如 *  + ?
    ### 元字符集中有特殊意义的为 - ^ 
    ### 一个星只匹配一个符号
    >>> re.findall("g[e*x]","fefefalgeeexxxx")
    ['ge']
    >>>

    ### []与-
    #[a-z]匹配a~z中的一个元素
    >>> re.findall("g[a-z]","feaafgua")
    ['gu']
    >>>
    
    >>> re.findall("g[a-z]*","feaafgua")
    ['gua']
    >>>

    ### [0-9]匹配0~9
    >>> re.findall("g[0-9]*","abcg123")
    ['g123']
    >>>

    ### []与^与-
    ### 注:^表示的是非的意思
    ### 匹配非0~9的字符
    >>> re.findall("g[^0-9]","feaafgua")
    ['gu']
    >>>

    ### 匹配非a~z的字符
    >>> re.findall("g[^a-z]*","feaafg4415ua")
    ['g4415']
    >>> re.findall("g[^a-z]*","feaafg44s15ua")
    ['g44']
    >>>

    ### 元字符转义字符 
    
    ### d 匹配任何的十进制数
    >>> re.findall("d","12+(23+34)")
    ['1', '2', '2', '3', '3', '4']
    >>> re.findall("d+","12+(23+34)")
    ['12', '23', '34']
    >>>

    ### D 匹配任何非数字字符
    >>> re.findall("D","12+(23+34)")
    ['+', '(', '+', ')']
    >>>

    ### s 匹配任何空白字符
    >>> re.findall("s","hello world")
    [' ']
    >>>

    ### S 匹配任何非空白字符
    >>> re.findall("S","hello world")
    ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
    >>> re.findall("S+","hello world")
    ['hello', 'world']
    >>>

    ### w 匹配任何字母,数字字符    相当于a-z  A-Z  0-9
    >>> re.findall("w","hello world111")
    ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '1', '1', '1']
    >>> re.findall("w+","hello world111")
    ['hello', 'world111']
    >>>
    
    >>> re.findall("w+","hello world111_+")
    ['hello', 'world111_']
    >>>

    ### W 匹配任何非数字,非字母字符
    >>> re.findall("W","abc123?._")
    ['?', '.']
    >>>

    
    
    ###  匹配一个特殊字符边界,比如空格 & # 
    >>> re.findall(r"I","hello I am LIST")
    ['I']
    >>>
    >>> re.findall("I\b","hello I am LIST")
    ['I']
    >>>
    ### 元字符之|
    |:俗称管道符
    >>> re.findall("ka|b","asdffka|b")
    ['ka', 'b']
    >>> re.findall("ka|b","asdffkab")
    ['ka', 'b']
    >>>

    ### 元字符之分组()
    注:search()    # 匹配字符串,只要匹配到一个就不再往下匹配
    >>> re.findall("d+","fadf55adfa85af58")
    ['55', '85', '58']
    
    >>> re.search("d+","fdfd58fdfd11df5df")
    <_sre.SRE_Match object at 0x028EFA68>    # 得到的是一个对象
    >>> re.search("d+","fdfd58fdfd11df5df").group()    # 利用group得出结果
    '58'
    >>>
    
    >>> re.search("[a-z]+","123hello123abc").group()
    'hello'
    >>>

       
    ### (?P<id>[a-z]+)自定义一个分组,分组名称为id
    >>> re.search("(?P<id>[a-z]+)","123hello123abc").group()
    'hello'
    >>>
    
    >>> re.search("(?P<id>[a-z]+)d","123hello123abc").group()
    'hello1'
    >>>
    
    >>> re.search("(?P<id>[a-z]+)d+","123hello123abc").group()
    'hello123'
    >>>
    
    >>> re.search("(?P<id>[a-z]+)d+","123hello123abc").group("id")
    'hello'
    >>>

    ## r

    re.findall(r"I","hello I am LIST")

    上方代码中 r 表示的作用:加上r表示对所处理的字符不做任何的转义,因为Python在进行解释时,会对转义字符进行转义,而re模块也会对转义字符进行转义,所以会照成干扰,加上r后,Python不对其进行转义,直接让re模块进行解释

    \b:Python对程序进行解释时,将其转义为,而后re模块对其进行解释,re表达式只能认为是 

    r"\b":Python对程序进行解释时,不进行转义,而直接给re模块进行处理

    # 一种不使用 r 的方法
    re.findall("c\\l")
    python对其进行转义,转义成c\l
    # 而后re对其再次进行转义,转义成cl
    # 所以将\\转义成
    >>> re.findall("I\\l","hello I am LIlST")
    ['I\l']
    >>>
    # 注:上方的结果为两个反斜杠,因为返回到python中时又添加了一个,表示

    . 表示一个普通点
    * 表示一个普通*

    ## re中常用的方法

    #1
    findall

    #2
    search

    #3
    match("a","abc").group()    # 用法与search,不同于match只取头

    #4
    >>> re.split("[ab]","abcd")    # 先按a进行分割,得到''和'bcd',再将''和'bcd’按b进行分割
    ['', '', 'cd']

    #5
    sub替换,具有三个参数
    >>> re.sub("d+","A","hello1998World")    # 将其中的数字替换为A 
    'helloAWorld'
    
    >>> re.sub("d","A","hello1998World")    # 将其中的每个数字替换为A
    'helloAAAAWorld'
    
    >>> re.sub("d","A","hello1998World",2)        # 后加参数2,匹配前两个数字
    'helloAA98World'

    #6
    >>> re.subn("d","A","hello1998World")        # 输出匹配后的内容与匹配的次数
    ('helloAAAAWorld', 4)

    #7
    com = re.compile("d")    
    # 将要匹配的规则存到com中
    # 可以重复使用com
    
    >>> com = re.compile("d")
    >>> com.findall("dfadfd1fwe33adf")
    ['1', '3', '3']

    #8
    >>> re.finditer("d+","efwerfqw1212rtfgwe4454")
    <callable-iterator object at 0x03008170>
    >>>
    # 与findall区别是返回一个迭代器对象
    # 好处:当处理大量数据是,不需要将所有的数据全部存放到内存中,而是存放到迭代器中
    >>> ret = re.finditer("d+","efwerfqw1212rtfgwe4454")
    >>> next(ret).group()    # 用next读取
    '1212'
    >>> next(ret).group()
    '4454'
    >>>

    # 注注:当使用分组时,re默认会将括号中分组的内容优先拿出,如下所示
    >>> re.findall("www.(baidu|sina).com","www.baidu.com")
    ['baidu']

    # 去优先级:加上?:
    >>> re.findall("www.(?:baidu|sina).com","www.baidu.com")
    ['www.baidu.com']
    # 补充
    >>> re.findall("(abc)+","abcabcabc")    # 括号有优先级,只显示一个
    ['abc']
    >>> re.findall("(?:abc)+","abcabcabc")    # 用?:取消优先级
    ['abcabcabc']
  • 相关阅读:
    Node.js 项目中使用 Babel
    面向对象第二单元作业总结与反思
    20192429马一 202120222 《网络与系统攻防》实验五 信息搜集技术实践
    20192401 王麦齐 202120222 《网络与系统攻防技术》实验五
    OOUnit2
    如何分析燃尽图?
    wiremock设置接口入参的判断条件
    pycharm常用快捷键
    玩转 Helm 之 upgrade
    点地图
  • 原文地址:https://www.cnblogs.com/Doaoao/p/10139833.html
Copyright © 2020-2023  润新知