Python-----正则表达式与Cookie的学习

 

 

正则表达式与Cookie

这篇我们将学习如何书写Python中使用的正则表达式,我们将从原子、元字符、模式选择符、模式单元符、模式修正符、贪婪模式、懒惰模式。

1.原子是正则表达式的最小基本单位,每个正则表达式至少含有一个原子,常见的原子如下:

  1. 普通字符作为原子
  2. 非打印字符作为原子
  3. 通用字符作为原子
  4. 原子表作为原子

1.1将普通字符作为原子,比如字母、数字、下划线等常见字符作为原子。

pattern = "yue"
string = "http://yum.iqianyue.com"
result = re.search(pattern, string)
print(result)

1.2所谓非打印字符,这些指的是在字符串中格式控制的字符,常见的换行符、制表符等

pattrn = "\n"
string = '''http://yum.iqianyue.com
http://yum.iqianyue.com'''
result = re.search(pattrn, string)
print(result)

1.3通用字符作为原子

patterns = "\w\dpython\w"
strings = "sadsad345python_aaa"
results = re.search(patterns, strings)
print(results)

1.4原子表作为原子:使用原子表,可以定义一组平等地位的原子,在使用过程可以用任意其中的一个字符来匹配。在python中,原子表用[]来表示,比如[abc]py,只要是"apy"、"acpy"等字符都是能匹配的。

pattrn1 = "\w\dpython[xyz]\w"
pattrn2 = "\w\dpython[^xyz]\w"
pattrn3 = "\w\dpython[xyz]\W"
string1 = "sadsad345python_aaa"
result1 = re.search(pattrn1, string1)
result2 = re.search(pattrn2, string1)
result3 = re.search(pattrn3, string1)
print(result1)
print(result2)
print(result3)

2.所谓元字符,就是正则表达式中一些特需的含义的字符,比如重复N次前面的字符。具体的来说,元字符可以分为以下几类:任意匹配元字符、边界限制符、限定符、模式选择符、模式单元符、模式修正符等。

2.1任意匹配元字符

字符"."可以匹配任意字符(包含数字、字母、下划线等)

pattrn1 = ".python..."
string1 = "dfsdf45python_1p"
result1 = re.search(pattrn1, string1)
print(result1)

2.2 边界限制符

字符"^"匹配字符串中开始的位置,字符"$"匹配字符串中结束的位置.

pattrn1 = "^abd"
pattrn2 = "^abc"
pattrn3 = "py$"
pattrn4 = "ay$"
string1 = "abc4564python_py"
result1 = re.search(pattrn1, string1)
result2 = re.search(pattrn2, string1)
result3 = re.search(pattrn3, string1)
result4 = re.search(pattrn4, string1)
print(result1)
print(result2)
print(result3)
print(result4)

2.3限定符:限定符也是元字符中的一种,常见的限定符包含"*、?、+、{n}、{n,}、{n,m}"

pattrn1 = "py.*n"
pattrn2 = "cd{2}"
pattrn3 = "cd{3}"
pattrn4 = "cd{2,}"
string1 = "sdsacddsa45python_ssd44"
result1 = re.search(pattrn1, string1)
result2 = re.search(pattrn2, string1)
result3 = re.search(pattrn3, string1)
result4 = re.search(pattrn4, string1)
print(result1)
print(result2)
print(result3)
print(result4)

2.4模式选择符"|",可以选择多个模式进行匹配,比如"android|python",这里既可以用"android",也可以用"python"来进行匹配

pattrn1 = "python|android"
string1 = "asdsa44android44python_sas56"
result1 = re.search(pattrn1, string1)
print(result1)

2.4模式单元符:指的是用"()"将一些原子组合起来成一个大原子,然后用将()起来当做一个整体来匹配使用.

pattrn1 = "(cd){1,}"
pattrn2 = "cd{1,}"
string1 = "ab45cdcdcdcdpython_sa456"
result1 = re.search(pattrn1, string1)
result2 = re.search(pattrn2, string1)
print(result1)
print(result2)

2.5模式修正符:指的是在不改变正则表达式的情况下,通过使用修正符来改变正则表达式的含义。

pattrn1 = "python"
pattrn2 = "PYTHON"
string1 = "sdsapython_a455"
result1 = re.search(pattrn1, string1)
result2 = re.search(pattrn2, string1, re.I)
print(result1)
print(result2)

2.6贪婪模式和懒惰模式:所谓的贪婪模式就是尽可能多的去匹配字符,匹配的范围比较大。所谓的懒惰模式就是尽可能少的去匹配字符,匹配的比较精确。(重点)

pattrn1 = "p.*y"
pattrn2 = "p.*?y"
string1 = "adsdphp345python_pysdas"
result1 = re.search(pattrn1, string1)
result2 = re.search(pattrn2, string1)
print(result1)
print(result2)

3.正则表达式函数的使用

3.1 re.match(pattern,string,flag)

第一个参数:正则表达式字符串,第二个参数:源字符串,第三个参数:修正符。

它的功能是:从起始位置开始匹配源字符串,如果说匹配成功,则返回对应的结果,匹配失败则返回None。

pattrn1 = ".python."
string1 = "dsapythonhfdjfpythonsd_s44"
result1 = re.match(pattrn1, string1)
result2 = re.match(pattrn1, string1).span()
print(result1)
print(result2)

3.2 re.search(pattern,string,flag)

第一个参数:正则表达式字符串,第二个参数:源字符串,第三个参数:修正符。

它的功能是:将在源字符串中进行全局的检索,将最先匹配的结果返回.

3.3 re.compile(pattern).findAll(string)全局匹配函数:

功能是:将源字符串中匹配到的多个结果,已列表的形式返回。

pattrn1 = ".python."
string1 = "dsapythonhfdjf+pythonsd_s44"
result1 = re.compile(pattrn1).findall(string1)
print(result1)

3.4 re.sub(pattern,reg,string,max)

第一个参数:正则表达式字符串,第二个参数:替换的字符串,第三个参数:源字符串,第四个参数:替换的次数,默认的是全局替换。

功能是:在源字符串中将匹配的结果用其他的字符串替换,返回一个新的字符串。

pattrn1 = "python."
string1 = "hellopythonaatopython_spythonsd_55"
result1 = re.sub(pattrn1, "WW", string1)
result2 = re.sub(pattrn1, "WW", string1, 2)
print(result1)
print(result2)

4. 案例

4.1 过滤以.com或者.cn为后缀的url的网址

string1 = "<a href = 'http://www.baidu.com'>百度</>"
pattrn1 = "[a-zA-Z]+://[^\s]*[.com|.cn]"
pattrn2 = "[a-z]{4}://[a-z]{3}[^\s]*[.com|.cn]"
result1 = re.search(pattrn1, string1)
result2 = re.search(pattrn2, string1)
print(result1)
print(result2)

4.2 过滤电话号码

pattrn1 = "\d{3}-\d{8}|\d{4}-\d{7}"
pattrn2 = "\d{11}"
string1 = "021-12345678"
string2 = "0721-1234567"
result1 = re.search(pattrn1, string1)
result2 = re.search(pattrn1, string2)
print(result1)
print(result2)

4.3 过滤电子邮件

pattrn1 = "\w+([.+-]\w+)*@\w+([.-]\w+)*\.\w+([.-]\w+)*"
string1 = "<a href = 'http://www.baidu.com'>百度</><br><a href = 'mailto:c-e+o@iqi.anyue.com.cn'></>"
result1 = re.search(pattrn1, string1)
print(result1)

 5. Cookie

我们在浏览器上访问一个页面,都是通过http协议来进行的,而http协议是一个无状态协议,所谓无状态协议就是在会话中无法维持回话之间的状态信息。比如我们登陆一个网站之后,在去访问其他网页信息,此时的回话状态已消失,这样我们每当访问一个网页都要去登录,这样很麻烦。因此我们需要去保存当前登录的回话信息。回话信息保存的方式有两种:1.通过Cookie来保存会话信息   2.通过session来保存会话信息。

Cookie : 回话信息保存在客户端,每次访问网页我们直接从cookie中读取用户信息,用户是否已经登录等信息,用户是可以禁止cookie来保存自己的信息,但是还是可以通过其他方式来存取信息。

session : 回话信息保存在服务器端,用户访问页面时,服务器端会向客户端发送一个sessionId,这个sessionId就是用户回话信息,最终还是会保存在cookie中。

在爬虫过程中我们经常会用到cookie,比如模拟登录操作等。

5.6 CookieJar的使用

url = "http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LC1c4"

# 1.用urllib.parse.urlencode方式来对post请求的数据进行编码,然后把编码过后数据设置为utf-8
postdata = urllib.parse.urlencode({"username": "乐乐4544", 
                                   "password": "19940915"}).encode('utf-8')
# 2.构造 requset的请求
req = urllib.request.Request(url, postdata)

# 3.模拟浏览器访问,在request请求中添加头部信息
req.add_header("User-Agent",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36")

# 4.给请求添加cookie
cjar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))

# 5.创建全局的opener
urllib.request.install_opener(opener)

# 6.在用全局的opener发送请求,读取网页数据
data = opener.open(req).read()

# 7.把网页数据保存在本地
handler_data = open("D:/python/file/7.html", "wb")
handler_data.write(data)
handler_data.close()

 

转载于:https://my.oschina.net/quguangle/blog/1838939

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值