美文网首页
9.正则表达式与JSON

9.正则表达式与JSON

作者: tomtiddler | 来源:发表于2018-10-01 09:23 被阅读0次

    初识正则表达式

    JSON :轻量级的数据交换格式 相应还有已经不怎么流行的XML
    正则表达式:特殊的字符序列,一个字符串是否与我们所设定的字符序列相匹配。以实现快速检索文本、实现一些普通文本的操作
    1.检查一串字符串是否是电话号码
    2.检测一个字符串是否符合email
    3.把一个文本里面指定的单词替换为另一个单词

    正则表达式的灵魂在于规则

    元字符与普通字符

    彩蛋:字符串相关的问题,都可以用for循环解决。但是太底层了
    Python -> 普通字符
    \d -> 元字符
    正则表达式主要是学习元字符以及组合
    元字符--百度百科----

    字符集

    普通字符+元字符
    普通字符一般用于定界
    [cf] 字符集 中括号中表示或关系。加上^ 表示取反[^cf] 不是 c 或者 f

    概括字符集:

    把一系列类似的字符集概括成简单的转义字符
    \d 数字 等价于[0-9]
    \D 非数字 等价于[^0-9]
    \w 匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的"单词"字符使用Unicode字符集。
    \W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
    \s 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
    \S 匹配任何可见字符。等价于[^ \f\n\r\t\v]。

    数量词

    数量词的用法

    import re
    
    a = "python 1111java678php"
    
    r = re.findall("[a-z]{3,6}", a)  # 贪婪匹配,尽可能多的匹配
    
    print(r)
    

    贪婪与非贪婪

    默认情况下,python倾向于贪婪匹配。
    [a-z]{3,6}? 加上问号,将采用非贪婪模式

    匹配0次1次或无限多次

    import re
    
    # * 匹配 0 次或者无限多次
    # + 匹配一次或者无限多此
    # ? 匹配0次或者1 次
    
    a = "pytho0python1pythonn2"
    
    r1 = re.findall("python*", a)
    r2 = re.findall("python+", a)
    r3 = re.findall("python?", a)
    
    print(r1)
    print(r2)
    print(r3)
    

    非贪婪: {3,6}? 问号前是数字范围
    单一的问号: 问号前是字符--匹配0次或者一次。

    边界匹配符

    import re
    
    # ^ 从字符串头部开始匹配
    # $ 匹配至字符串尾部
    
    qq = "100001"
    
    r = re.findall('^\d{4,8}$', qq)  # 匹配完整字符串
    
    print(r)
    

    [] 中括号表示或关系
    () 小括号表示且关系

    匹配模式参数

    re.findall(reg, str, flag) -> 第三个参数
    flag: 匹配模式

    import re
    
    language = "PythonC#JavaPHP"
    
    r = re.findall("c#", language, re.I | re.S)  # I 忽略大小写 S 点匹配任何字符 -> 点号本来排除换行符和回车符的。 | 符号 -> 都生效
    
    print(r)
    

    re sub 正则替换

    re.sub(pattern. repl, string, count=0, flag) 用于字符串替换

    import re
    
    language = "PythonC#JavaPHP"
    
    r = re.sub("C#", "GO", language, count=0)  # count=0代表无限地替换,如果不是0,则是指定替换次数
    
    print(r)
    

    str.replace 字符串不可变,所以需要一个变量接收新字符串

    sub 能通过替换函数实现复杂替换

    import re
    
    def convert(value):
        matched = value.group()
        return "!!" + matched + "!!"
    
    language = "PythonC#JavaPHPC#C#"
    
    r = re.sub("C#", convert, language, 1)
    
    print(r)
    

    把函数作为参数传递

    repl 可以指定为函数被调用 -- 非常强大的功能
    函数的传入参数类似:
    <_sre.SRE_Match object; span=(6, 8), match='C#'>
    被替换的字符串所在位置为value.group()
    意义:通过不同的匹配结果替换不同的值。函数支持就变得非常重要了。

    import re
    
    def convert(value):
        matched = int(value.group())
        if matched >= 6:
            return '9'
        else:
            return '0'
    
    language = "A8C3721D86"
    
    r = re.sub("\d", convert, language, 0)
    
    print(r)
    

    search与match函数

    re.findall -> 遍历匹配,返回结果列表
    以下函数只匹配一次,然后会返回
    re.match -> 从首字母开始匹配,没结果返回None,一旦匹配上返回结果对象。
    re.search -> 搜索字符串,一旦找到结果就返回结果对象。

    findall 不返回位置信息
    re.group() 返回匹配结果 re.span() 返回匹配的字符串的位置

    group分组

    import re
    
    s = "Life is short, I use Python"
    
    r = re.search("Life(.*)Python", s)
    
    print(r.group(1))
    print(r.groups())
    

    group(0)代表整个匹配结果,然后就是根据括号的顺序返回组字符串

    group 可以有多个

    一些关于学习正则的建议

    正则表达式是很厉害的工具
    几乎所有的主流语言都支持正则表达式
    对于常用的,可以直接百度拿过来自己用
    正则表达式大全一

    理解JSON

    Javascript Object Notation -> JS对象标记
    是一种轻量级的数据交换格式
    XML 较为重量级
    字符串是JSON的表现形式
    符合JSON格式的字符串叫做JSON字符串
    JSON优势:
    易于阅读、易于解析、网络传输效率高、跨语言

    反序列化

    json的键值对字符串需要用双引号,不能采用单引号。

    import json
    
    json_str = """{"name":"tom", "age":18}"""
    
    a = json.loads(json_str)  # 反序列化成字典
    
    print(a)
    
    b = json.dumps(a)  # 序列化成字符串
    
    print(b)
    

    反序列化的结果是字典
    对于同样的json字符串,不同语言可能转换成不同的格式
    json -> array 形式类似 list 转换到python就是 list
    json false -> python False
    null -> None
    number -> int、float

    序列化

    对象推荐使用NoSQL数据库存储

    小谈json、json对象与json字符串

    json对象只存在javascript中。跳出语言,其他语言并不存在json对象
    REST 服务的标准格式是JSON

    相关文章

      网友评论

          本文标题:9.正则表达式与JSON

          本文链接:https://www.haomeiwen.com/subject/dmgwnftx.html