抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

本文学习正则表达式以及正则表达式如何在Python中使用。

Python 正则表达式

正则:对字符串的检索匹配和处理。

Python通过re模块提供对正则表达式的支持:

  1. 先将正则表达式的字符串形式编译为Pattern实例
  2. 使用Pattern实例处理文本并获取匹配结果
  3. 使用实例获取信息,进行其他操作

image-20200411203652438

一个简单的实例:

1
2
3
4
import re
pattern = re.compile('hello')
match = pattern.match('hello world')
print(match.group())

或者采取一种更简便的方式:

1
2
word = re.findall('hello', 'hello world!')
print(word)

正则表达式常用字符

  1. 利用.匹配任意单字符(仅一位)
1
2
3
word = "http://murraynizeyu.github.io python-exec"
key = re.findall('h.',word)
print(key) #['ht', 'hu', 'ho']
  1. 利用\匹配被转义的字符
1
2
3
word = "http://murraynizeyu.github.io python-exec"
key = re.findall('\...',word)
print(key) #['.gi', '.io']
  1. 利用[xxx]匹配中任意单字符(仅一位)
    • ^取反操作:[^abc]表示匹配不是abc的其他字符
    • 所有的特殊字符(]、[、-、^)在字符集中都失去原有的特殊含义,需要加上\防止转义。
1
2
3
word = "http://murraynizeyu.gitnuz.io python-exec"
key = re.findall('n[ui]z',word)
print(key) #['niz', 'nuz']
预定义字符集(写在pattern中)
字符 意义
\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
2
3
4
5
import requests
url = 'https://s.taobao.com/search?q=%E6%89%8B%E6%9C%BA&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306'
html = requests.get(url)
re.findall(r'{"areaName":"(.*?)"', html.text)
#['中国大陆','中国香港','中国澳门'...]

在页面中国家与地区的显示格式如下{"areaName":"文莱",...},因此我们设置匹配模式pattern="{"areaName":"(.*?)"",以非贪婪模式进行。

评论