Parse库介绍

介绍一个看到的python第三方库parse,主要用途是代替正则表达式做字符匹配的

正则表达式通常被用来做模板匹配等字符任务,其缺点是规则缺少语义解释不好长时间记忆,表达式的可读性很差。

于是今天学习一个相对简单的第三方库parse,当然,这个parse也没有re一样强大全面的功能、应该说各有利弊。

Outline

  • parse常见需求分析
  • parse使用方法解析
  • parse返回结果分析

常见需求分析

  1. 当需要接收传进来的长字符串中包含的部分数据,可以用一个写好的规则(pattern)来检测这个字符串
  2. 当判断某个字符串是否符合某个格式时也可以用这种方法(以前都是用split进行的😁)
  3. 某个pattern需要被重复利用
  4. 直接对提取的内容进行类型转化(int datetime float …)
  5. 去除匹配得到的信息前后的空格
  6. 控制匹配时的大小写敏感
  7. 限制匹配内容的长度(匹配字符数)

使用方法说明

  1. 基本用法

    from parse import *
    profile = parse("I am {}, {} years old, {}", "I am Jack, 27 years old, male")
    profile
    # >>> <Result ('Jack', '27', 'male') {}>
    

    parse.parse方法的第一个参数是模板,第二个参数是目标字符串

    {}内无参数名时,返回的对象可以看作一个list,profile[0]即可取得内容

    {param}内有参数名时,有参数名的内容构成一个dict、无参数名的内容构成一个list。也就是同时可以用[idx][key]来调结果

    profile = parse("I am {name}, {age} years old, {gender}", "I am Jack, 27 years old, male")
    # >>> <Result () {'gender': 'male', 'age': '27', 'name': 'Jack'}>
    
  2. pattern重复利用

    将pattern字符串用compile接收

    from parse import compile
    pattern = compile("I am {}, {} years old, {}")
    

pattern.parse(“I am Jack, 27 years old, male”)


3. 内置类型转换方法

`{:d}`表示转化为整数,其他的也是`{param:type}`这样进行转化的

```python
profile = parse("I am {name}, {age:d} years old, {gender}", "I am Jack, 27 years old, male")

下面时type的具体内容以及解释

| Type | Characters Matched                                                                   | Output   |
|------|--------------------------------------------------------------------------------------|----------|
| l    | Letters \(ASCII\)                                                                    | str      |
| w    | Letters, numbers and underscore                                                      | str      |
| W    | Not letters, numbers and underscore                                                  | str      |
| s    | Whitespace                                                                           | str      |
| S    | Non\-whitespace                                                                      | str      |
| d    | Digits \(effectively integer numbers\)                                               | int      |
| D    | Non\-digit                                                                           | str      |
| n    | Numbers with thousands separators \(, or \.\)                                        | int      |
| %    | Percentage \(converted to value/100\.0\)                                             | float    |
| f    | Fixed\-point numbers                                                                 | float    |
| F    | Decimal numbers                                                                      | Decimal  |
| e    | Floating\-point numbers with exponent e\.g\. 1\.1e\-10, NAN \(all case insensitive\) | float    |
| g    | General number format \(either d, f or e\)                                           | float    |
| b    | Binary numbers                                                                       | int      |
| o    | Octal numbers                                                                        | int      |
| x    | Hexadecimal numbers \(lower and upper case\)                                         | int      |
| ti   | ISO 8601 format date/time e\.g\. 1972\-01\-20T10:21:36Z \(“T” and “Z” optional\)     | datetime |
| te   | RFC2822 e\-mail format date/time e\.g\. Mon, 20 Jan 1972 10:21:36 \+1000             | datetime |
| tg   | Global \(day/month\) format date/time e\.g\. 20/1/1972 10:21:36 AM \+1:00            | datetime |
| ta   | US \(month/day\) format date/time e\.g\. 1/20/1972 10:21:36 PM \+10:30               | datetime |
| tc   | ctime\(\) format date/time e\.g\. Sun Sep 16 01:03:52 1973                           | datetime |
| th   | HTTP log format date/time e\.g\. 21/Nov/2011:00:07:11 \+0000                         | datetime |
| ts   | Linux system log format date/time e\.g\. Nov 9 03:37:44                              | datetime |
| tt   | Time e\.g\. 10:21:36 PM \-5:30                                                       | time     |
  1. 去除无关空格

    parse('hello {:^} , hello python', 'hello     world    , hello python')
    # >>> <Result ('world',) {}>
    
  2. 开关大小写敏感

    parse默认是不区分大小写的匹配,case_sensitive=True即开启大小写敏感

    parse('SPAM', 'spam', case_sensitive=True)
    
  3. 限制匹配字符数

    target = "http://jlu.edu.cn/username=55161115&password=xxx/u12g3evbhjv2uyv23"
    pattern = "http://jlu.edu.cn/username={user:.8}&{}" # 要求user必须小于等于8位,否则返回结果为None
    # pattern = "{}username={username}&password={password}/{}"
    parse(pattern, target)
    

返回结果

返回结果是一个result对象,有三个属性:fixednamedspans

  • fixed储存无参数名的匹配结果 ==> list
  • named储存有参数名的匹配结果 ==> dict
  • spans储存匹配位置信息 ==> list

Reference