Parse库介绍
介绍一个看到的python第三方库parse,主要用途是代替正则表达式做字符匹配的
正则表达式通常被用来做模板匹配等字符任务,其缺点是规则缺少语义解释不好长时间记忆,表达式的可读性很差。
于是今天学习一个相对简单的第三方库parse,当然,这个parse也没有re一样强大全面的功能、应该说各有利弊。
Outline
- parse常见需求分析
- parse使用方法解析
- parse返回结果分析
常见需求分析
- 当需要接收传进来的长字符串中包含的部分数据,可以用一个写好的规则(pattern)来检测这个字符串
- 当判断某个字符串是否符合某个格式时也可以用这种方法(以前都是用split进行的😁)
- 某个pattern需要被重复利用
- 直接对提取的内容进行类型转化(int datetime float …)
- 去除匹配得到的信息前后的空格
- 控制匹配时的大小写敏感
- 限制匹配内容的长度(匹配字符数)
使用方法说明
基本用法
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'}>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 |
去除无关空格
parse('hello {:^} , hello python', 'hello world , hello python') # >>> <Result ('world',) {}>开关大小写敏感
parse默认是不区分大小写的匹配,
case_sensitive=True即开启大小写敏感parse('SPAM', 'spam', case_sensitive=True)限制匹配字符数
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对象,有三个属性:fixed、named、spans
- fixed储存无参数名的匹配结果 ==> list
- named储存有参数名的匹配结果 ==> dict
- spans储存匹配位置信息 ==> list