zoukankan      html  css  js  c++  java
  • re

    依赖re模块

    匹配单个字符

    .
    
    import re
    ret = re.match(".","M")
    print(ret.group())
    
    ret = re.match("t.o","too")
    print(ret.group())
    
    ret = re.match("t.o","two")
    print(ret.group())
    >>>
    M
    too
    two
    
    [ ]
    import re
    
    # 如果hello的首字符小写,那么正则表达式需要小写的h
    ret = re.match("h","hello Python") 
    print(ret.group())
    
    
    # 如果hello的首字符大写,那么正则表达式需要大写的H
    ret = re.match("H","Hello Python") 
    print(ret.group())
    
    # 大小写h都可以的情况
    ret = re.match("[hH]","hello Python")
    print(ret.group())
    ret = re.match("[hH]","Hello Python")
    print(ret.group())
    ret = re.match("[hH]ello Python","Hello Python")
    print(ret.group())
    
    # 匹配0到9第一种写法
    ret = re.match("[0123456789]Hello Python","7Hello Python")
    print(ret.group())
    
    # 匹配0到9第二种写法
    ret = re.match("[0-9]Hello Python","7Hello Python")
    print(ret.group())
    
    #跳过了4
    
    ret = re.match("[0-35-9]Hello Python","7Hello Python")
    print(ret.group())
    
    # 下面这个正则不能够匹配到数字4,因此ret为None
    ret = re.match("[0-35-9]Hello Python","4Hello Python")
    # print(ret.group())
    
    
    import re
    
    # 普通的匹配方式
    ret = re.match("嫦娥1号","嫦娥1号发射成功") 
    print(ret.group())
    
    
    # 使用\d进行匹配
    ret = re.match("嫦娥\d号","嫦娥1号发射成功") 
    print(ret.group())
    
    
    import re
    
    match_obj = re.match("\D", "f")
    if match_obj:
        # 获取匹配结果
        print(match_obj.group())
    else:
        print("匹配失败")
    
    import re
    
    # 空格属于空白字符
    match_obj = re.match("hello\sworld", "hello world")
    if match_obj:
        result = match_obj.group()
        print(result)
    else:
        print("匹配失败")
    
    
    
    # \t 属于空白字符
    match_obj = re.match("hello\sworld", "hello\tworld")
    if match_obj:
        result = match_obj.group()
        print(result)
    else:
        print("匹配失败")
    
    import re
    
    match_obj = re.match("hello\Sworld", "hello&world")
    if match_obj:
    result = match_obj.group()
    print(result)
    else:
    print("匹配失败")
    
    
    
    match_obj = re.match("hello\Sworld", "hello$world")
    if match_obj:
    result = match_obj.group()
    print(result)
    else:
    print("匹配失败")
    
    import re
    
    # 匹配非特殊字符中的一位
    match_obj = re.match("\w", "A")
    if match_obj:
        # 获取匹配结果
        print(match_obj.group())
    else:
        print("匹配失败")
    
    # 匹配特殊字符中的一位
    match_obj = re.match("\W", "&")
    if match_obj:
        # 获取匹配结果
        print(match_obj.group())
    else:
        print("匹配失败")
    



    image.png

    import re
    
    #  | 	匹配左右任意一个表达式
    
    # 定义列表
    my_list = ["苹果", "芒果", "菠萝", "草莓", "香蕉"]
    
     # 芒果 草莓
    for name in my_list:
    
     # 正则
     match_obj = re.match("芒果|草莓", name)
    #判断
    if match_obj:
        print("%s是我想要的水果" % match_obj.group())
    else:
        print("%s不是我想要的水果" % name)
    
    
    # (ab) 	将括号中字符作为一个分组
    # 邮箱
    # 163 126 qq sina
    # 因为在正则中.有特殊的函数 代表的是任意字符
    # 需求: 只是单纯的代表一个点
    # 解决方案" \ (转义字符) .
    match_obj = re.match("[a-zA-Z0-9_]{5,20}@(163|126|qq|sina)\.com", "hello@163.com")
    print(match_obj.group())
    
    
    match_obj = re.match("(\w+)(@)(163|126|qq|sina)\.com", "hello@163.com")
    
    
    print(match_obj.group())         hello@163.com
    print(match_obj.group(0))        hello@163.com
    print(match_obj.group(1))         hello
    print(match_obj.group(2))         @
    print(match_obj.group(3))         163
    
     \num 	引用分组num匹配到的字符串
    
    # 字符串
    desc = "<html>hh</html>"
    
    match_obj = re.match("<(\w*)>.*</\\1>", desc)
    print(match_obj.group())
    
    
    </\\1> /表示/html的/
    第二个\表示转义字符
    第三个\和1配合使用,道标第一组的正则
    
    match_obj = re.match("<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", desc)
    if match_obj:
        print(match_obj.group())
    else:
         print("匹配失败")
    
    

    desc = "水果有201个 其中苹果10个"
    match_obj = re.search("\d+", desc)
    print(match_obj.group())
    
    desc ="水果有20个 其中苹果10个"
    match_obj = re.findall('\d+',desc)
    print(match_obj)
    
    >>    ['20','10']
    
    desc = "评论数:10 赞数:20"
    # result = re.sub("\d+", "666", desc)
    # print(result)
    
    
    # 02: 需求: 10 20 -> (num + 10) * 2
    desc = "评论数:10 赞数:20"
    
    def deal_data(match_obj):
         result = int(match_obj.group())
         return str((result + 10) * 2)
    
    result = re.sub("\d+", deal_data, desc)
    print(result)
    
    \d进行正则匹配,匹配到的是match_obj对象,
    因为匹配到的是字符串,要进行int转换才能进行运算,
    最终返回到原始的字符串中需要再次转化为str
    
    desc = "貂蝉,杨玉环:西施-王昭君"
    my_list = re.split(",|:|-", desc)
    print(my_list)
    
    ['貂蝉', '杨玉环', '西施', '王昭君']
    
    
    compile()与findall()一起使用,返回一个列表。
    import re
    def main():
        content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
        regex = re.compile('\w*o\w*')
        x = regex.findall(content)
        print(x)
    
    
    if __name__ == '__main__':
        main()
    # ['Hello', 'from', 'Chongqing', 'montain', 'to', 'you']
    
    compile()与match()一起使用,可返回一个class、str、tuple。但是一定需要注意match(),从位置0开始匹配,匹配不到会返回None,
    返回None的时候就没有span/group属性了,并且与group使用,返回一个单词‘Hello’后匹配就会结束。
    
    
    import re
    def main():
        content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
        regex = re.compile('\w*o\w*')
        y = regex.match(content)
        print(y)
        print(type(y))
        print(y.group())
        print(y.span())
    
    
    if __name__ == '__main__':
        main()
    # <_sre.SRE_Match object; span=(0, 5), match='Hello'>
    # <class '_sre.SRE_Match'>
    # Hello
    # (0, 5)
    
    #compile()与search()搭配使用, 返回的类型与match()差不多,
    但是不同的是search(), 可以不从位置0开始匹配。但是匹配一个单词之后,匹配和match()一样,匹配就会结束。
    
    import re
    def main():
        content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
        regex = re.compile('\w*o\w*')
        z = regex.search(content)
        print(z)
        print(type(z))
        print(z.group())
        print(z.span())
    
    
    if __name__ == '__main__':
        main()
    # <_sre.SRE_Match object; span=(0, 5), match='Hello'>
    # <class '_sre.SRE_Match'>
    # Hello
    # (0, 5)
    
    

    import re
    
    s = "This is a number 234-235-22-423"
    
    match_obj = re.match(".+(\d+-\d+-\d+-\d+)", s)
    print(match_obj.group())
    # python正则是贪婪 尽可能多的匹配
    print(match_obj.group(1))
    
    match_obj = re.match(".+?(\d+-\d+-\d+-\d+)", s)
    print(match_obj.group())
    print(match_obj.group(1))
    
    # 02:
    desc = """<img data-original="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" src="https://rpic.douyucdn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg" style="display: inline;">"""
    match_obj = re.search("https?://.*?\.jpg", desc)
    if match_obj:
        print(match_obj.group())
    


    import re
    m = re.match(r'(.*) are (.*?) dog','fat are cat dog 111')
    
    print('整句话',m.group(0))
    整句话 fat are cat dog
    
    print(m.group(1))
    fat
    
    print(m.group(2))
    cat
    
    print(m.groups())
    ('fat', 'cat')
    
    import re
    m = re.match('www','www.baidu.com')
    
    print('结果对象',m)
    结果对象 <_sre.SRE_Match object; span=(0, 3), match='www'>
    
    print('结果',m.group())
    结果 www
    
    print('起始与终点',m.span())
    起始与终点 (0, 3)
    
    print('匹配的起始位置',m.start())
    匹配的起始位置 0
    
    print('终点位置',m.end())
    终点位置 3
    

    问题

    1. 报错 nothing to repeat at position
      r = 'asdadsasdasd*'
      re.search(r,str)
      报错

    正则有问题, r应该为 '.asdasd.asdasd.*'

    
    中文符号	规则	中文符号	规则
    (	\uff08	)	\uff09
    〈	\u3008	〉	\u3009
    《	\u300a	》	\u300b
    「	\u300c	」	\u300d
    『	\u300e	』	\u300f
    ﹃	\ufe43	﹄	\ufe44
    〔	\u3014	〕	\u3015
    …	\u2026	—	\u2014
    ~	\uff5e	﹏	\ufe4f
    ¥	\uffe5	、	\u3001
    【	\u3010	】	\u3011
    ,	\uff0c	。	\u3002
    ?	\uff1f	!	\uff01
    :	\uff1a	;	\uff1b
    “	\u201c	”	\u201d
    ‘	\u2018	’	\u2019
    

    查找两个特殊字符之间的段落

    pat = re.conpile('字符1'+'(.*?)'+'字符2',re.S)
    res_list = pat.findall(data)  # 获取所有符合正则的段落信息
    
    注意:
    如果段落是这样的  
    aaa
    asdasdasd
    aaa
    dsfdsfdsfdf
    aaa
    
    字符1 和字符2 都用aaa的话,会抵消掉一个,可以在处理直线将aaa变为 aaa\naaa
    aaa
    gdsffsgfdg
    aaa
    aaa
    gsfdsgs
    aaa
    aaa
    asdasdasd
    
  • 相关阅读:
    Spring读取properties内容
    SpringBoot全局异常处理
    Hibernate入门
    Oracle查询表及注释
    MySQL重复与不重复问题
    IDEA中other settings不见了
    01程序员修炼之道
    团队冲刺(四)
    单词字母查询频率
    学习进度(9)
  • 原文地址:https://www.cnblogs.com/cizao/p/11481750.html
Copyright © 2011-2022 走看看