本文学习正则表达式以及正则表达式如何在Python中使用。
Python 正则表达式
正则:对字符串的检索匹配和处理。
Python通过re模块提供对正则表达式的支持:
- 先将正则表达式的字符串形式编译为Pattern实例
- 使用Pattern实例处理文本并获取匹配结果
- 使用实例获取信息,进行其他操作
一个简单的实例:
1 | import re |
或者采取一种更简便的方式:
1 | word = re.findall('hello', 'hello world!') |
正则表达式常用字符
- 利用
.
匹配任意单字符(仅一位)
1 | word = "http://murraynizeyu.github.io python-exec" |
- 利用
\
匹配被转义的字符
1 | word = "http://murraynizeyu.github.io python-exec" |
- 利用
[xxx]
匹配中任意单字符(仅一位)^
取反操作:[^abc]
表示匹配不是abc的其他字符- 所有的特殊字符(]、[、-、^)在字符集中都失去原有的特殊含义,需要加上
\
防止转义。
1 | word = "http://murraynizeyu.gitnuz.io python-exec" |
字符 | 意义 |
---|---|
\d |
数字=[0-9] |
\D |
非数字=[^\d] |
\s |
非空字符=[<space>\t\r\f\v] |
\S |
非空白字符(除了空格)=[^\s] |
\w |
单词字符=[A-Za-z0-9] |
\W |
非单词字符=[^\w] |
字符 | 意义 |
---|---|
* |
匹配前一个字符0次或无限次 |
+ |
匹配前一个字符1次或无限次 |
? |
匹配前一个字符0次或1次 |
{m} |
匹配前一个字符m次 |
{m,n} |
匹配前一个字符m次至n次 |
字符 | 意义 |
---|---|
I | 代表左右表达式任意匹配一个(先匹配左边后右边) |
(…) | 被括起来的表达式将作为一个分组 |
贪婪模式与非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。Python里的数量词默认是贪婪的,就是尝试匹配尽量可能多的字符。非贪婪则相反,总是匹配尽可能少的字符。
举个粟子:
给出一个正则表达式"ab*"
用户查找"abbbc"
。
在贪婪模式下,将找到”abbbc”;在非贪婪模式下("ab*?"
),将找到”a”。
正则表达式常用Pattern
1.匹配中文字符
1 | [\u4e00-\u9fa5] |
2.匹配双字节字符(包括汉字在内)
1 | [^\x00-\xff] |
3.匹配空白行
1 | \n\s*\r |
4.匹配Email地址
1 | [\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])? |
5.匹配网址URL
1 | [a-zA-z]+://[^\s]* |
6.匹配国内电话号码
1 | \d{3}-\d{8}|\d{4}-\{7,8} |
7.匹配腾讯QQ
1 | [1-9][0-9]{4,} |
8.匹配中国邮政编码
1 | [1-9]\d{5}(?!\d) |
9.匹配18位身份证号
1 | ^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$ |
10.匹配(年-月-日)格式日期
1 | ([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))) |
11.匹配整数
1 | ^-?[1-9]\d*$ |
正则表达式练习
爬取淘宝页面所支持国家与地区
1 | import requests |
在页面中国家与地区的显示格式如下{"areaName":"文莱",...}
,因此我们设置匹配模式pattern="{"areaName":"(.*?)""
,以非贪婪模式进行。