Python之正则表达式

Python之正则表达式

1.正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败,具体如下图:



1.1 贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

1.2 反斜线

与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

1.3 检测匹配是否正确

 当我们不知道自己匹配的正则是否正确时可以登陆网站:
https://regex101.com/检测,只需要把需要匹配的代码拷贝进来,然后自行写入匹配原则,网站就会自动显示匹配是否成功

2.re模块

re模块是python中处理正则表达式的一个模块,通过re模块的方法,把正则表达式pattern编译成正则对象,以便使用正则对象的方法。那为什么要使用re模块来把正则表达式搞成正则对象呢,最主要的是可以提高代码的执行效率,我们来看个例子:

#!/usr/bin/env python

# -*- coding:utf8 -*-

# @Time     : 2017/11/14 9:36

# @Author   : hantong

# @File     : regex1.py

import timeit

print timeit.timeit(setup='''import re; reg = re.compile('<(?P<tagname>\w*)>.*</(?P=tagname)>')''', stmt='''reg.match('<h1>xxx</h1>')''', number=1000000)

print timeit.timeit(setup='''import re''', stmt='''re.match('<(?P<tagname>\w*)>.*</(?P=tagname)>', '<h1>xxx</h1>')''', number=1000000)

执行结果:
1.2734959402
2.99342720664

注:综上可以看出把正则表示成正则对象效率会高很多。

#!/usr/bin/env python

# -*- coding:utf8 -*-

# @Time     : 2017/11/14 9:36

# @Author   : hantong

# @File     : regex1.py

import re

reg = re.compile(r'abc.*')

print(type(reg))

#可以看到这个类型是一个正则对象

print(reg)

执行结果

#!/usr/bin/env python
# -*- coding:utf8 -*-
# @Time     : 2018/5/2 21:10
# @Author   : hantong
# @File     : 20180502_test.py
import re
import requests

url = "http://qwd.jd.com/fcgi-bin/qwd_searchitem_ex?skuid=26878432382%7C1658610413%7C26222795271%7C25168000024%7C11731514723%7C26348513019%7C20000220615%7C4813030%7C25965247088%7C5327182%7C19588651151%7C1780924%7C15495544751%7C10114188069%7C27036535156%7C10123099847%7C26016197600%7C10503200866%7C16675691362%7C15904713681"

session = requests.session()
r = session.get(url)
html = r.text
# print(html)

reg = re.compile(r"\"skuid\":\"(\d+)\",\s+\"\S+\s+\"skuurl\"\S+\s+\"skuimgurl\":\"(\S+)\",")
result = reg.findall(html)
print(result)

<type '_sre.SRE_Pattern'>
<_sre.SRE_Pattern object at 0x0000000002757030>
利用正则匹配京东页面信息,获取商品编号和对应商品图片

#!/usr/bin/env python
# -*- coding:utf8 -*-
# @Time     : 2018/5/2 21:10
# @Author   : hantong
# @File     : 20180502_test.py
import re
import requests

url = "http://qwd.jd.com/fcgi-bin/qwd_searchitem_ex?skuid=26878432382%7C1658610413%7C26222795271%7C25168000024%7C11731514723%7C26348513019%7C20000220615%7C4813030%7C25965247088%7C5327182%7C19588651151%7C1780924%7C15495544751%7C10114188069%7C27036535156%7C10123099847%7C26016197600%7C10503200866%7C16675691362%7C15904713681"

session = requests.session()
r = session.get(url)
html = r.text
# print(html)

reg = re.compile(r"\"skuid\":\"(\d+)\",\s+\"\S+\s+\"skuurl\"\S+\s+\"skuimgurl\":\"(\S+)\",")result = reg.findall(html)print(result)