zoukankan      html  css  js  c++  java
  • 模块之json、pickle、re

    1.json&pickle

    import json
    x="[null,true,false,‘1']"
    print(eval(x)) #报错,无法解析null类型,而json就可以
    print(json.loads(x))  #报错,无法解析'1',单引号,而json就可以
    json.dump(obj,fileobj)  #
    json.load(fileobj) 
    json.dumps(obj)   # str
    json.loads(obj)   # dict
    pickle.load(fileobj)  # 返回python对象
    

    2.re模块

    img

    重复匹配

    . ? * + {m,n} .* .*?
    
    1. . 匹配任意字符,除了换行符(re.DOTALL 这个参数可以匹配
    )。
    	re.findall('a.b', 'ab aab a*b a2b a牛b a
    b')  # ['aab', 'a*b', 'a2b', 'a牛b']
    	re.findall('a.b', 'ab aab a*b a2b a牛b a
    b',re.DOTALL))  # ['aab', 'a*b', 'a2b', 'a牛b']
        
    2. ?  匹配0个或者1个由左边字符定义的片段。
    # print(re.findall('a?b', 'ab aab abb aaaab a牛b aba**b'))  # ['ab', 'ab', 'ab', 'b', 'ab', 'b', 'ab', 'b']
    
    3. * 匹配0个或者多个左边字符表达式。 满足贪婪匹配 
    # print(re.findall('a*b', 'ab aab aaab abbb'))  # ['ab', 'aab', 'aaab', 'ab', 'b', 'b']
    # print(re.findall('ab*', 'ab aab aaab abbbbb'))  # ['ab', 'a', 'ab', 'a', 'a', 'ab', 'abbbbb']
    
    4. + 匹配1个或者多个左边字符表达式。 满足贪婪匹配  
    # print(re.findall('a+b', 'ab aab aaab abbb'))  # ['ab', 'aab', 'aaab', 'ab']
    
    5. {m,n}  匹配m个至n个左边字符表达式。 满足贪婪匹配  @@
    # print(re.findall('a{2,4}b', 'ab aab aaab aaaaabb'))  # ['aab', 'aaab']
    
    6. .* 贪婪匹配 从头到尾.
    # print(re.findall('a.*b', 'ab aab a*()b'))  # ['ab aab a*()b']
    
    7 .*? 此时的?不是对左边的字符进行0次或者1次的匹配,
     而只是针对.*这种贪婪匹配的模式进行一种限定:告知他要遵从非贪婪匹配 推荐使用!
    # print(re.findall('a.*?b', 'ab a1b a*()b, aaaaaab'))  # ['ab', 'a1b', 'a*()b']
    8.[]: 括号中可以放任意一个字符,一个中括号代表一个字符
      - 在[]中表示范围,如果想要匹配上- 那么这个-符号不能放在中间.
       ^ 在[]中表示取反的意思.
    # print(re.findall('a.b', 'a1b a3b aeb a*b arb a_b'))  # ['a1b', 'a3b', 'a4b', 'a*b', 'arb', 'a_b']
    # print(re.findall('a[abc]b', 'aab abb acb adb afb a_b'))  # ['aab', 'abb', 'acb']
    # print(re.findall('a[0-9]b', 'a1b a3b aeb a*b arb a_b'))  # ['a1b', 'a3b']
    # print(re.findall('a[a-z]b', 'a1b a3b aeb a*b arb a_b'))  # ['aeb', 'arb']
    # print(re.findall('a[a-zA-Z]b', 'aAb aWb aeb a*b arb a_b'))  # ['aAb', 'aWb', 'aeb', 'arb']
    # print(re.findall('a[0-9][0-9]b', 'a11b a12b a34b a*b arb a_b'))  # ['a11b', 'a12b', 'a34b']
    # print(re.findall('a[*-+]b','a-b a*b a+b a/b a6b'))  # ['a*b', 'a+b']
    9 - 在[]中表示范围,如果想要匹配上- 那么这个-符号不能放在中间.
    # print(re.findall('a[-*+]b','a-b a*b a+b a/b a6b'))  # ['a-b', 'a*b', 'a+b']
    # print(re.findall('a[^a-z]b', 'acb adb a3b a*b'))  # ['a3b', 'a*b']
    

    分组

    1.() 制定一个规则,将满足规则的结果匹配出来
    # print(re.findall('(.*?)_sb', 'alex_sb wusir_sb 日天_sb'))  # ['alex', ' wusir', ' 日天']
    # 应用举例:
    # print(re.findall('href="(.*?)"','<a href="http://www.baidu.com">点击</a>'))#															['http://www.baidu.com']
    2.| 匹配 左边或者右边
    # print(re.findall('alex|太白|wusir', 'alex太白wusiraleeeex太太白odlb'))  # ['alex', '太白', 'wusir', '太白']
    # print(re.findall('compan(y|ies)','Too many companies have gone bankrupt, and the next one is my company'))  # ['ies', 'y']
    3. 分组() 中加入?: 表示将整体匹配出来而不只是()里面的内容。
    	re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))  # ['companies', 'company']
    
    

    常用方法

    1 findall 全部找到返回一个列表。
    # print(re.findall('a', 'alexwusirbarryeval'))  # ['a', 'a', 'a']
    2 search 只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
    # print(re.search('sb|alex', 'alex sb sb barry 日天'))  # <_sre.SRE_Match object; span=(0, 4), match='alex'>
    # print(re.search('alex', 'alex sb sb barry 日天').group())  # alex
     3 match:None,同search,不过在字符串开始处进行匹配,完全可以用search+^代替match
    # print(re.match('barry', 'barry alex wusir 日天'))  # <_sre.SRE_Match object; span=(0, 5), match='barry'>
    # print(re.match('barry', 'barry alex wusir 日天').group()) # barry
     4 split 分割 可按照任意分割符进行分割
    # print(re.split('[ ::,;;,]','alex wusir,日天,太白;女神;肖锋:吴超'))  # ['alex', 'wusir', '日天', '太白', '女神', '肖锋', '吴超']
     5 sub 替换
    # print(re.sub('barry', '太白', 'barry是最好的讲师,barry就是一个普通老师,请不要将barry当男神对待。'))
    # 太白是最好的讲师,太白就是一个普通老师,请不要将太白当男神对待。
    # print(re.sub('barry', '太白', 'barry是最好的讲师,barry就是一个普通老师,请不要将barry当男神对待。',2))
    # 太白是最好的讲师,太白就是一个普通老师,请不要将barry当男神对待。
    # print(re.sub('([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)', r'52341', r'alex is sb'))
    # sb is alex
    6 重复使用
    # obj=re.compile('d{2}')
    # print(obj.search('abc123eeee').group()) #12
    # print(obj.findall('abc123eeee')) #['12'],重用了obj
    
    7. finditer
      ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
    # print(ret)  # <callable_iterator object at 0x10195f940>
    # print(next(ret).group())  #查看第一个结果
    # print(next(ret).group())  #查看第二个结果
    # print([i.group() for i in ret])  #查看剩余的左右结
    

    命名分组

    # 命名分组匹配:
    ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>")
    # 还可以在分组中利用?<name>的形式给分组起名字
    # #获取的匹配结果可以直接用group('名字')拿到对应的值
    # print(ret.group('tag_name'))  #结果 :h1
    # print(ret.group())  #结果 :<h1>hello</h1>
    #
    # ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>")
    # #如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致
    # #获取的匹配结果可以直接用group(序号)拿到对应的值
    # print(ret.group(1)) #结果: hello
    # print(ret.group())  #结果 :<h1>hello</h1>
    
    永远不要高估自己
  • 相关阅读:
    108. Convert Sorted Array to Binary Search Tree
    How to check if one path is a child of another path?
    Why there is two completely different version of Reverse for List and IEnumerable?
    在Jenkins中集成Sonarqube
    如何查看sonarqube的版本 how to check the version of sonarqube
    Queue
    BFS广度优先 vs DFS深度优先 for Binary Tree
    Depth-first search and Breadth-first search 深度优先搜索和广度优先搜索
    102. Binary Tree Level Order Traversal 广度优先遍历
    How do I check if a type is a subtype OR the type of an object?
  • 原文地址:https://www.cnblogs.com/liqiangwei/p/14563920.html
Copyright © 2011-2022 走看看