• python re模块findall()详解


    import re
    
    string="abcdefg  acbdgef  abcdgfe  cadbgfe"
    
    #带括号与不带括号的区别
    #不带括号
    regex=re.compile("((w+)s+w+)")
    print(regex.findall(string))
    #输出:[('abcdefg  acbdgef', 'abcdefg'), ('abcdgfe  cadbgfe', 'abcdgfe')]
    
    regex1=re.compile("(w+)s+w+")
    print(regex1.findall(string))
    #输出:['abcdefg', 'abcdgfe']
    
    regex2=re.compile("w+s+w+")
    print(regex2.findall(string))
    #输出:['abcdefg  acbdgef', 'abcdgfe  cadbgfe']

    第一个 regex 中是带有2个括号的,我们可以看到其输出是一个list 中包含2个 tuple 

    第二个 regex 中带有1个括号,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果。

    第三个 regex 中不带有括号,其输出的内容就是整个表达式所匹配到的内容。

    结论:findall()返回的是括号所匹配到的结果(如regex1),多个括号就会返回多个括号分别匹配到的结果(如regex),如果没有括号就返回就返回整条语句所匹配到的结果(如regex2)。所以在提取数据的时候就需要注意这个坑。

    实际上是由其并不是python特有的,这是 正则 所特有的 , 任何一门高级语言使用正则都满足这个特点:有括号时只能匹配到括号中的内容,没有括号【相当于在最外层增加了一个括号】。在正则里面 “()” 代表的是分组的意思,一个括号代表一个分组,你只能匹配到"()"中的内容

    ===================================================================================================================

    1.先说一下findall()函数的两种表示形式

    1 import re
    2 kk = re.compile(r'd+')
    3 kk.findall('one1two2three3four4')
    4 #[1,2,3,4]
    5  
    6 #注意此处findall()的用法,可传两个参数;
    7 kk = re.compile(r'd+')
    8 re.findall(kk,"one123")
    9 #[1,2,3]
    2. 正则表达式可能遇到的坑  --- 正则表达式中有括号()

    1. 正则表达式中当没有括号时,就是正常匹配,在本例中"/w+/s+/w+"第一次匹配到的字符为"2345  3456",由于是贪婪模式会     继续匹配,第二次从"4567"开始匹配匹配到的结果为字符串"4567 5678"

    import re
    string="2345  3456  4567  5678"
    regex=re.compile("w+s+w+")
    print(regex.findall(string))
    #['2345 3456', '4567 5678']

    首先的知道各个字符所表达的含义,这里只说一下/s 和 /S
    s -- 匹配任何不可见字符,包括空格、制表符、换页符等等 
    S -- 匹配任何可见字符   通常[/s/S] -- 可匹配任意字符
    [sS]*? -- 匹配懒惰模式的任意字符

    2. 正则表达式中有一个括号时,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果,但是整个正则表达式执行了只不过只输出括号匹配到的内容, 在第一次匹配时跟上述没有括号时一样,匹配到 "2345  3456" ,只不过只输出(/w+)匹配     到的结果 即"2345",第二次匹配同理从"4567" 开始,匹配到"4567  5678",但是还是只是输出"4567"

    import re
    string="2345  3456  4567  5678"
    regex=re.compile("(w+)s+w+")
    print(regex.findall(string))
    #['2345','4567']

    3. 当正则表达式中有两个括号时,其输出是一个list 中包含2个 tuple,从输出的结果可以看出,有两个元组,每一个元组中有两个字符串 : 其中第一个字符串"2345 3456"是最外面的括号输出的结果,第二个是里面括号(/w+)输出的结果 "2345", 第二个元组是  第二次匹配的结果 -- 详解同第一次匹配。

    import re
    string="2345  3456  4567  5678"
    regex=re.compile("((w+)s+w+)")
    print(regex.findall(string))
    #[('2345  3456', '2345'), ('4567  5678', '4567')]
  • 相关阅读:
    jq02--基础函数
    jq01--概述
    js06--函数库jq与prototype
    eclipse启动时 failed to create the java virtual machine 解决办法
    将博客搬至CSDN
    eclipse.ini 修改默认编码为 UTF-8
    Elicpse使用技巧-打开选中文件文件夹或者包的当前目录
    eclipse换了高版本的maven插件后报错:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project
    python进行数据清理之pandas中的drop用法
    如何用Python实现常见机器学习算法-4
  • 原文地址:https://www.cnblogs.com/joneylulu/p/10358731.html
Copyright © 2020-2023  润新知