数据解析


1. 正则表达式

概念:按照一定的规则,从某个字符串中匹配出想要的数据。

1.1 正则表达式单字符匹配

  • match
    1
    2
    3
    4
    5
    import requests
    import re
    text = "ab"
    ret=re.match(".",text)
    print(ret.group())

输出结果: a

点(.)匹配任意字符,但不能匹配到换行符。

  • d 匹配任意的数字
    1
    2
    3
    4
    import re
    text = "123456"
    ret=re.match("d",text)
    print(ret.group())

输出结果: 1

  • D 匹配任意的非数字
    1
    2
    3
    4
    import re
    text = "a"
    ret=re.match("D",text)
    print(ret.group())

输出结果: a
如果 text 是等于一个数字,就不能匹配成功

  • s 匹配的是空白字符(包括:n,t,r 和空格)
1
2
3
4
import re
text = "t"
ret=re.match("s",text)
print(ret.group())

输出结果: 没有输出,空白

  • w 匹配的是 a-z 和 A-Z 以及数字和下划线
1
2
3
4
import re
text = "_"
ret=re.match("w",text)
print(ret.group())

输出结果: _

  • W 匹配的是 和 w 相反的
    1
    2
    3
    4
    import re
    text = "+"
    ret=re.match("W",text)
    print(ret.group())

输出结果: +

  • [] 组合的方式,只要满足中括号中的某一项都算匹配成功
1
2
3
4
import re
text = "0731-888888"
ret=re.match("[d-]+",text)
print(ret.group())

输出结果: 0731-888888

补充:前面的几种匹配规则,可以使用中括号的形式进行代替
1)d :[0-9]
2)D:[^0-9]
3)w:[0-9a-zA-Z]
3)W:[^0-9a-zA-Z]

1.2 正则表达式匹配多个字符串

  • 星号可以匹配0或者任意多个字符串
    1
    2
    3
    4
    import re
    text = "0731"
    ret=re.match("d*",text)
    print(ret.group())

输出结果: 0731

因为匹配要求是 d,要求是数字,后面跟一个星号,就可以匹配到 0731 了。

  • 加号可以匹配1或者任意多个字符串,最少一个
1
2
3
4
import re
text = "abc"
ret=re.match("w+",text)
print(ret.group())

输出结果: abc

  • ? 匹配的字符可以出现一次或者不出现(0或1)
1
2
3
4
import re
text = "123"
ret=re.match("d?",text)
print(ret.group())

输出结果: 1

  • {m} 匹配m个字符
1
2
3
4
import re
text = "123"
ret=re.match("d{2}",text)
print(ret.group())

输出结果: 12

  • {m} 匹配m-n个字符,在这中间的字符都能匹配到
1
2
3
4
import re
text = "123"
ret=re.match("d{1,2}",text)
print(ret.group())

输出结果: 12

如果 text 只有一个字符,也可以匹配出来

1
2
3
4
import re
text = "1"
ret=re.match("d{1,2}",text)
print(ret.group())

输出结果: 1

1.3 正则表达式小案例

1)验证手机号码:手机号码规则是以1开头,第二位可以是34587,后面那9位就可以随意

1
2
3
4
import re
text = "18570631587"
ret=re.match("1[34587]d{9}",text)
print(ret.group())

输出结果: 18570631587

2)验证邮箱:邮箱规则是邮箱名称用数字、字母、下划线组成,然后是@符号,后面是域名

1
2
3
4
import re
text = "[email protected]"
ret=re.match("[email protected]+.[a-zA-Z.]+",text)
print(ret.group())

输出结果: [email protected]

3)验证身份证:身份证规则是共有18位,前面17位都是数字,后面一位可以是数字,也可以是小写的x,也可以是大写的X

1
2
3
4
import re
text = "12457415268451248x"
ret=re.match("d{17}[dxX]",text)
print(ret.group())

输出结果: 12457415268451248x

1.4 正则表达式之开始结束和或语法

  • ^(脱字号)表示以 … 开始
1
2
3
4
import re
text = "hello"
ret=re.match("^h",text)
print(ret.group())

输出结果: h

输出结果: [email protected]

  • | 匹配多个表达式或者字符串
    1
    2
    3
    4
    import re
    text = "hello|world"
    ret=re.match("hello",text)
    print(ret.group())

输出结果: hello

  • 贪婪模式和非贪婪模式
    1)贪婪模式:正则表达式会匹配尽量多的字符,默认是贪婪模式
    1
    2
    3
    4
    import re
    text = "0123456"
    ret=re.match("d+",text)
    print(ret.group())

输出结果: 0123456
2)非贪婪模式:正则表达式会尽量少匹配字符

1
2
3
4
import re
text = "0123456"
ret=re.match("d+?",text)
print(ret.group())

输出结果: 0

  • 匹配0~100之间的数字
    可以出现的:1,2,3,10,100,99…
    有三种情况:1,99,100
    不可以出现:09,101
    1
    2
    3
    4
    import re
    text = "99"
    ret=re.match("[1-9]d?$|100$",text)
    print(ret.group())

输出结果: 99

1.5 正则表达式之转义字符和原生字符串

  • 在正则表达式中,有些字符是有特殊意义的字符,如果想要匹配这些字符,就必须使用反斜杠进行转义,例如 $ 代表的是以 …结尾,如果想要匹配它,就必须使用反斜杠加上它本身
1
2
3
4
import re
text = "tomato price is $99,orange price is $75"
ret=re.search("$(d+)",text)
print(ret.group())

输出结果: $99

  • 原生字符串:在正则表达式中, 是专门用来转义的。在 python 中 也是用来做转义的,因此想要在普通的字符串中匹配出 ,就要使用四个
import re
text = "tomato c"
ret=re.search("\\c",text)
print(ret.group())

输出结果: c

2. re 模块中常用的函数

2.1 match 函数

1.png | center | 300x0

2.2 search 函数

2.png | center | 300x0

2.3 findall、sub 函数

3.png | center | 300x0

2.4 split、compile 函数

4.png | center | 300x0

可能用到的工具链接: