python学习第五天

类和对象
类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问题对应。
对象是由类创造出来的变量,它可以调用类里面的所以函数(方法),效果就像函数的函数名,可以操作函数一样。
和普通的函数相比,在类中定义的方法只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。
init(self)方法
数据的初始化,不需要调用,当创建了一个对象时既自动调用了该方法。
init()里面的属性值可以进行累加,不会随着调用方法的结束而初始化
如连续调用方法,可以存储上一次调用的结果,再调用时该属性是上一次调用结果的值。
init(self)中的self参数,不需要传递,python解释器会自动把当前的对象引用传递进去。
示例
class Student(object):

def __init__(self, name, score):
    self.name = name
    self.score = score

由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。
以学生类为例,通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去。
self
谁调用这个对象,self就指向谁。
如果使用了self.变量名,同一个类里面的方法都可以使用。
class Student(object):

def __init__(self, name, score):
    self.name = name
    self.score = score
def test(self)
    print(self.name) 

str(self)方法
获取对象的描述信息,如果没有使用该方法,print对象时输出的是内存地址,而使用了str(),方法内的描述信息是什么就输出什么。
实例(烤土豆)
#创建一个五谷杂粮类
class Cereals():
def init(self):
self.status = “生的”
self.bake_time = 0

def __str__(self):
    return "土豆考了%d分钟,状态是:%s" % (self.bake_time, self.status)

def bake(self, time):
    self.bake_time += time
    if self.bake_time >= 0 and self.bake_time < 3:
        self.status = "生的"
    elif self.bake_time >= 3 and self.bake_time <= 5:
        self.status = "半生不熟"
    elif self.bake_time > 5 and self.bake_time <= 8:
        self.status = "熟了"
    elif self.bake_time > 8:
        self.status = "烤糊了"

if name == ‘main’:
创建土豆对象
td = Cereals()
循环烤9分钟
for i in range(1,9):
td.bake(1)
print(td)

输出结果:
土豆考了1分钟,状态是:生的
土豆考了2分钟,状态是:生的
土豆考了3分钟,状态是:半生不熟
土豆考了4分钟,状态是:半生不熟
土豆考了5分钟,状态是:半生不熟
土豆考了6分钟,状态是:熟了
土豆考了7分钟,状态是:熟了
土豆考了8分钟,状态是:熟了
土豆考了9分钟,状态是:烤糊了

del(self)方法
对象结束前,删除对象的方法,就相当于玩王者荣耀英雄死完后,会发一声惨叫的功能。
del(self)方法,可以做一些善后工作。
new(cls)方法
用来创建对象,创建对象实际要做三件事
1、调用new方法来创建对象,然后找一个特殊的变量来接收new的返回值
这个返回值表示 创建出来的对象的引用。
2、init(刚刚创建出来对象的引用)。
3、返回对象的引用。
双下划线的作用
私用方法,外面不能调用,只能在类里面其他方法可以调用。
def __方法名():
pass

测量对象的引用个数
导入sys模块使用里面的方法进行检查
import sys
检查当前有多少个对象指向了同一个类
sys.getrefcount(对象名)
返回个数比实际的大1,将得到的数减1则是实际的引用个数。

正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。

re 模块使 Python 语言拥有全部的正则表达式功能。

compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

本章节主要介绍Python中常用的正则表达式处理函数。
re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

函数语法:

re.match(pattern, string, flags=0)

函数参数说明:
参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

匹配成功re.match方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
实例
#!/usr/bin/python-- coding: UTF-8 --

import re
print(re.match(‘www’, ‘www.runoob.com’).span()) # 在起始位置匹配
print(re.match(‘com’, ‘www.runoob.com’)) # 不在起始位置匹配

以上实例运行输出结果为:

(0, 3)
None

实例
#!/usr/bin/python
import re

line = “Cats are smarter than dogs”

matchObj = re.match( r’(.) are (.?) .*’, line, re.M|re.I)

if matchObj:
print "matchObj.group() : ", matchObj.group()
print "matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)
else:
print “No match!!”

以上实例执行结果如下:

matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern, string, flags=0)

函数参数说明:
参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.search方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 描述
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
实例
#!/usr/bin/python
-- coding: UTF-8 --

import re
print(re.search(‘www’, ‘www.runoob.com’).span()) # 在起始位置匹配
print(re.search(‘com’, ‘www.runoob.com’).span()) # 不在起始位置匹配

以上实例运行输出结果为:

(0, 3)
(11, 14)

实例
#!/usr/bin/python
import re

line = “Cats are smarter than dogs”;

searchObj = re.search( r’(.) are (.?) .*’, line, re.M|re.I)

if searchObj:
print "searchObj.group() : ", searchObj.group()
print "searchObj.group(1) : ", searchObj.group(1)
print "searchObj.group(2) : ", searchObj.group(2)
else:
print “Nothing found!!”
以上实例执行结果如下:

searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
实例
#!/usr/bin/python
import re

line = “Cats are smarter than dogs”;

matchObj = re.match( r’dogs’, line, re.M|re.I)
if matchObj:
print "match --> matchObj.group() : ", matchObj.group()
else:
print “No match!!”

matchObj = re.search( r’dogs’, line, re.M|re.I)
if matchObj:
print "search --> matchObj.group() : ", matchObj.group()
else:
print “No match!!”
以上实例运行结果如下:

No match!!
search --> matchObj.group() : dogs

检索和替换

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, count=0, flags=0)

参数:

pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

实例
!/usr/bin/python -- coding: UTF-8 --

import re

phone = “2004-959-559 # 这是一个国外电话号码”

删除字符串中的 Python注释
num = re.sub(r’#.*$’, “”, phone)
print "电话号码是: ", num

删除非数字(-)的字符串
num = re.sub(r’\D’, “”, phone)
print "电话号码是 : ", num
以上实例执行结果如下:

电话号码是: 2004-959-559
电话号码是 : 2004959559

repl 参数是一个函数

以下实例中将字符串中的匹配的数字乘以 2:
实例
#!/usr/bin/python
-- coding: UTF-8 --

import re

将匹配的数字乘以 2
def double(matched):
value = int(matched.group(‘value’))
return str(value * 2)

s = ‘A23G4HFD567’
print(re.sub(’(?P\d+)’, double, s))

执行输出结果为:

A46G8HFD1134

re.compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

语法格式为:

re.compile(pattern[, flags])

参数:

pattern : 一个字符串形式的正则表达式

flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
    re.I 忽略大小写
    re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
    re.M 多行模式
    re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
    re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
    re.X 为了增加可读性,忽略空格和 # 后面的注释

实例
实例

import re
pattern = re.compile(r’\d+’) # 用于匹配至少一个数字
m = pattern.match(‘one12twothree34four’) # 查找头部,没有匹配
print m
None

m = pattern.match(‘one12twothree34four’, 2, 10) # 从’e’的位置开始匹配,没有匹配
print m
None

m = pattern.match(‘one12twothree34four’, 3, 10) # 从’1’的位置开始匹配,正好匹配
print m # 返回一个 Match 对象
<_sre.SRE_Match object at 0x10a42aac0>

m.group(0) # 可省略 0
‘12’

m.start(0) # 可省略 0
3

m.end(0) # 可省略 0
5

m.span(0) # 可省略 0
(3, 5)

在上面,当匹配成功时返回一个 Match 对象,其中:

group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
span([group]) 方法返回 (start(group), end(group))。

再看看一个例子:
实例

import re
pattern = re.compile(r’([a-z]+) ([a-z]+)’, re.I) # re.I 表示忽略大小写
m = pattern.match(‘Hello World Wide Web’)
print m # 匹配成功,返回一个 Match 对象
<_sre.SRE_Match object at 0x10bea83e8>

m.group(0) # 返回匹配成功的整个子串
‘Hello World’

m.span(0) # 返回匹配成功的整个子串的索引
(0, 11)

m.group(1) # 返回第一个分组匹配成功的子串
‘Hello’

m.span(1) # 返回第一个分组匹配成功的子串的索引
(0, 5)

m.group(2) # 返回第二个分组匹配成功的子串
‘World’

m.span(2) # 返回第二个分组匹配成功的子串
(6, 11)

m.groups() # 等价于 (m.group(1), m.group(2), …)
(‘Hello’, ‘World’)

m.group(3) # 不存在第三个分组
Traceback (most recent call last):
File “”, line 1, in
IndexError: no such group
findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法格式为:

findall(string[, pos[, endpos]])

参数:

string : 待匹配的字符串。
pos : 可选参数,指定字符串的起始位置,默认为 0。
endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

查找字符串中的所有数字:
实例

-- coding:UTF8 --

import re

pattern = re.compile(r’\d+’) # 查找数字
result1 = pattern.findall(‘runoob 123 google 456’)
result2 = pattern.findall(‘run88oob123google456’, 0, 10)

print(result1)
print(result2)

输出结果:

[‘123’, ‘456’]
[‘88’, ‘12’]

re.finditer

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

re.finditer(pattern, string, flags=0)

参数:
参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
实例
-- coding: UTF-8 --

import re

it = re.finditer(r"\d+",“12a32bc43jf3”)
for match in it:
print (match.group() )

输出结果:

12
32
43
3

re.split

split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

re.split(pattern, string[, maxsplit=0, flags=0])

参数:
参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串。
maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
实例

import re
re.split(’\W+’, ‘runoob, runoob, runoob.’)
[‘runoob’, ‘runoob’, ‘runoob’, ‘’]

re.split(’(\W+)’, ’ runoob, runoob, runoob.’)
[’’, ’ ', ‘runoob’, ', ', ‘runoob’, ', ', ‘runoob’, ‘.’, ‘’]

re.split(’\W+’, ’ runoob, runoob, runoob.’, 1)
[’’, ‘runoob, runoob, runoob.’]

re.split(‘a*’, ‘hello world’) # 对于一个找不到匹配的字符串而言,split 不会对其作出分割
[‘hello world’]
正则表达式对象
re.RegexObject

re.compile() 返回 RegexObject 对象。
re.MatchObject

group() 返回被 RE 匹配的字符串。

start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置 

正则表达式修饰符 - 可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式:

字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

多数字母和数字前加一个反斜杠时会拥有不同的含义。

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

反斜杠本身需要使用反斜杠转义。

由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r’\t’,等价于 ‘\t’)匹配相应的特殊字符。

下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[…] 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’
[^…] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n} 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的两个 o。
re{ n,} 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 “foooood"中的所有 o。“o{1,}” 等价于 “o+”。“o{0,}” 则等价于 “o*”。
re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b 匹配a或b
(re) 对正则表达式分组并记住匹配的文本
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 类似 (…), 但是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#…) 注释.
(?= re) 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。等
\1…\9 匹配第n个分组的内容。
\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。
正则表达式实例
字符匹配
实例 描述
python 匹配 “python”.
字符类
实例 描述
[Pp]ython 匹配 “Python” 或 “python”
rub[ye] 匹配 “ruby” 或 “rube”
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符
特殊字符类
实例 描述
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。

re模块
正则表达式是用来匹配处理字符串的 python 中使用正则表达式需要引入re模块

如:

import re #第一步,要引入re模块

a = re.findall(“匹配规则”, “要匹配的字符串”) #第二步,调用模块函数

以列表形式返回匹配到的字符串

如:
View Code

^元字符

字符串开始位置与匹配规则符合就匹配,否则不匹配

匹配字符串开头。在多行模式中匹配每一行的开头

^元字符如果写到[]字符集里就是反取

View Code

[a-z]反取,匹配出除字母外的字符,元字符如果写到字符集里就是反取

View Code

$元字符

字符串结束位置与匹配规则符合就匹配,否则不匹配

匹配字符串末尾,在多行模式中匹配每一行的末尾
View Code

*元字符

需要字符串里完全符合,匹配规则,就匹配,(规则里的*元字符)前面的一个字符可以是0个或多个原本字符

匹配前一个字符0或多次,贪婪匹配前导字符有多少个就匹配多少个很贪婪

如果规则里只有一个分组,尽量避免用*否则会有可能匹配出空字符串
View Code

+元字符

需要字符串里完全符合,匹配规则,就匹配,(规则里的+元字符)前面的一个字符可以是1个或多个原本字符

匹配前一个字符1次或无限次,贪婪匹配前导字符有多少个就匹配多少个很贪婪
View Code

?元字符,和防止贪婪匹配

需要字符串里完全符合,匹配规则,就匹配,(规则里的?元字符)前面的一个字符可以是0个或1个原本字符

匹配一个字符0次或1次

还有一个功能是可以防止贪婪匹配,详情见防贪婪匹配
View Code

{}元字符,范围

需要字符串里完全符合,匹配规则,就匹配,(规则里的 {} 元字符)前面的一个字符,是自定义字符数,位数的原本字符

{m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次

{0,}匹配前一个字符0或多次,等同于*元字符
{+,}匹配前一个字符1次或无限次,等同于+元字符
{0,1}匹配前一个字符0次或1次,等同于?元字符
View Code

[]元字符,字符集

需要字符串里完全符合,匹配规则,就匹配,(规则里的 [] 元字符)对应位置是[]里的任意一个字符就匹配

字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。
所有特殊字符在字符集中都失去其原有的特殊含义。用\反斜杠转义恢复特殊字符的特殊含义。
View Code

[]非,反取,匹配出除[]里面的字符,^元字符如果写到字符集里就是反取

View Code

反斜杠后边跟普通字符实现特殊功能;(即预定义字符)

预定义字符是在字符集和组里都是有用的

\d匹配任何十进制数,它相当于类[0-9]
View Code

\d+如果需要匹配一位或者多位数的数字时用
View Code

\D匹配任何非数字字符,它相当于类[^0-9]
View Code

\s匹配任何空白字符,它相当于类[\t\n\r\f\v]
View Code

\S匹配任何非空白字符,它相当于类[^\t\n\r\f\v]
View Code

\w匹配包括下划线在内任何字母数字字符,它相当于类[a-zA-Z0-9_]
View Code

\W匹配非任何字母数字字符包括下划线在内,它相当于类[^a-zA-Z0-9_]
View Code

()元字符,分组

也就是分组匹配,()里面的为一个组也可以理解成一个整体

如果()后面跟的是特殊元字符如 (adc)* 那么*控制的前导字符就是()里的整体内容,不再是前导一个字符

列1
View Code

列2
View Code

|元字符,或

|或,或就是前后其中一个符合就匹配
View Code

r原生字符

将在python里有特殊意义的字符如\b,转换成原生字符(就是去除它在python的特殊意义),不然会给正则表达式有冲突,为了避免这种冲突可以在规则前加原始字符r

re模块中常用功能函数

正则表达式有两种书写方式,一种是直接在函数里书写规则,
View Code

match()函数(以后常用)

match,从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
match(pattern, string, flags=0)
pattern: 正则模型
string : 要匹配的字符串
falgs : 匹配模式

注意:match()函数 与 search()函数基本是一样的功能,不一样的就是match()匹配字符串开始位置的一个符合规则的字符串,search()是在字符串全局匹配第一个合规则的字符串
View Code

?P #?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容(只对正则函数返回对象的有用)

取出匹配对象方法

只对正则函数返回对象的有用

group() # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来,有参取匹配到的第几个如2
groups() # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
groupdict() # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果

search()函数
search,浏览全部字符串,匹配第一符合规则的字符串,浏览整个字符串去匹配第一个,未匹配成功返回None
search(pattern, string, flags=0)
pattern: 正则模型
string : 要匹配的字符串
falgs : 匹配模式

注意:match()函数 与 search()函数基本是一样的功能,不一样的就是match()匹配字符串开始位置的一个符合规则的字符串,search()是在字符串全局匹配第一个合规则的字符串
View Code

findall()函数(以后常用)

findall(pattern, string, flags=0)
pattern: 正则模型
string : 要匹配的字符串
falgs : 匹配模式

浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表

注意:一旦匹配成,再次匹配,是从前一次匹配成功的,后面一位开始的,也可以理解为匹配成功的字符串,不在参与下次匹配
View Code

注意:如果没写匹配规则,也就是空规则,返回的是一个比原始字符串多一位的,空字符串列表
View Code

注意:正则匹配到空字符的情况,如果规则里只有一个组,而组后面是就表示组里的内容可以是0个或者多过,这样组里就有了两个意思,一个意思是匹配组里的内容,二个意思是匹配组里0内容(即是空白)所以尽量避免用否则会有可能匹配出空字符串

注意:正则只拿组里最后一位,如果规则里只有一个组,匹配到的字符串里在拿组内容是,拿的是匹配到的内容最后一位
View Code

无分组:匹配所有合规则的字符串,匹配到的字符串放到一个列表中

View Code

有分组:只将匹配到的字符串里,组的部分放到列表里返回,相当于groups()方法
View Code

多个分组:只将匹配到的字符串里,组的部分放到一个元组中,最后将所有元组放到一个列表里返

相当于在group()结果里再将组的部分,分别,拿出来放入一个元组,最后将所有元组放入一个列表返回
View Code

分组中有分组:只将匹配到的字符串里,组的部分放到一个元组中,先将包含有组的组,看作一个整体也就是一个组,把这个整体组放入一个元组里,然后在把组里的组放入一个元组,最后将所有组放入一个列表返回
View Code

?:在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()

View Code

split()函数

根据正则匹配分割字符串,返回分割后的一个列表

split(pattern, string, maxsplit=0, flags=0)
pattern: 正则模型
string : 要匹配的字符串
maxsplit:指定分割个数
flags : 匹配模式

按照一个字符将全部字符串进行分割
View Code

将匹配到的字符串作为分割标准进行分割
View Code

sub()函数

替换匹配成功的指定位置字符串

sub(pattern, repl, string, count=0, flags=0)
pattern: 正则模型
repl : 要替换的字符串
string : 要匹配的字符串
count : 指定匹配个数
flags : 匹配模式
View Code

subn()函数

替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受

subn(pattern, repl, string, count=0, flags=0)
pattern: 正则模型
repl : 要替换的字符串
string : 要匹配的字符串 count : 指定匹配个数 flags : 匹配模式
View Code

元字符表

.

需要字符串里完全符合,匹配规则,就匹配,(规则里的.元字符)可以是任何一个字符,匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符)

a.c

abc

\

1.反斜杠后边跟元字符去除特殊功能;(即将特殊字符转义成普通字符),2.反斜杠后边跟普通字符实现特殊功能;(即预定义字符),3.\2引用序号对应的字组

a.c;a\c

a.c;a\c

需要字符串里完全符合,匹配规则,就匹配,(规则里的元字符)前面的一个字符可以是0个或多个原本字符,匹配前一个字符0或多次,贪婪匹配前导字符有多少个就匹配多少个很贪婪,如果规则里只有一个分组,尽量避免用否则会有可能匹配出空字符串

abc*

ab;abccc

需要字符串里完全符合,匹配规则,就匹配,(规则里的+元字符)前面的一个字符可以是1个或多个原本字符,匹配前一个字符1次或无限次,贪婪匹配前导字符有多少个就匹配多少个很贪婪

abc+

abc;abccc

?

需要字符串里完全符合,匹配规则,就匹配,(规则里的?元字符)前面的一个字符可以是0个或1个原本字符,匹配一个字符0次或1次,还有一个功能是可以防止贪婪匹配,详情见防贪婪匹配

abc?

ab;abc

^

字符串开始位置与匹配规则符合就匹配,否则不匹配,匹配字符串开头。在多行模式中匹配每一行的开头,^元字符如果写到[]字符集里就是反取

^abc

abc

$

字符串结束位置与匹配规则符合就匹配,否则不匹配,匹配字符串末尾,在多行模式中匹配每一行的末尾

abc$

abc

|

|或,或就是前后其中一个符合就匹配

abc|def

abc

def

{}

需要字符串里完全符合,匹配规则,就匹配,(规则里的 {} 元字符)前面的一个字符,是自定义字符数,位数的原本字符,{m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次,{0,}匹配前一个字符0或多次,等同于*元字符,{+,}匹配前一个字符1次或无限次,等同于+元字符,{0,1}匹配前一个字符0次或1次,等同于?元字符

ab{1,2}c

abc

abbc

[]

需要字符串里完全符合,匹配规则,就匹配,(规则里的 [] 元字符)对应位置是[]里的任意一个字符就匹配,字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。所有特殊字符在字符集中都失去其原有的特殊含义。用\反斜杠转义恢复特殊字符的特殊含义。

a[bcd]e

abe

ace

ade

()

也就是分组匹配,()里面的为一个组也可以理解成一个整体,如果()后面跟的是特殊元字符如 (adc)* 那么*控制的前导字符就是()里的整体内容,不再是前导一个字符

(abc){2}
a(123|456)c

abcabc

a456c

预定义字符集表,可以写在字符集[…]中

\d

\d匹配任何十进制数,它相当于类[0-9],\d+如果需要匹配一位或者多位数的数字时用

a\bc

a1c

\D

\D匹配任何非数字字符,它相当于类[^0-9]

a\Dc

abc

\s

\s匹配任何空白字符,它相当于类[\t\n\r\f\v]

a\sc

a c

\S

\S匹配任何非空白字符,它相当于类[^\t\n\r\f\v]

a\Sc

abc

\w

\w匹配包括下划线在内任何字母数字字符,它相当于类[a-zA-Z0-9_]

a\wc

abc

\W

\W匹配非任何字母数字字符包括下划线在内,它相当于类[^a-zA-Z0-9_]

a\Wc

a c

\A

仅匹配字符串开头,同^

\Aabc

abc

\Z

仅匹配字符串结尾,同$

abc\Z

abc

\b

b匹配一个单词边界,也就是指单词和空格间的位置

\babc\b
a\b!bc

空格abc空格
a!bc

\B

[^\b]

a\Bbc

abc

特殊分组用法表:只对正则函数返回对象的有用

(?P)

?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容,在用groupdict()方法打印字符串

(?Pabc){2}

abcabc

(?P=name)

引用别名为的分组匹配到字符串

(?P\d)abc(?P=id)

1abc1

5abc5

<number>

引用编号为的分组匹配到字符串

(\d)abc\1

1abc1

5abc5

正则匹配模式表

标志

含义

re.S(DOTALL)

使.匹配包括换行在内的所有字符

re.I(IGNORECASE)

使匹配对大小写不敏感

re.L(LOCALE)

做本地化识别(locale-aware)匹配,法语等

re.M(MULTILINE)

多行匹配,影响^和$

re.X(VERBOSE)

该标志通过给予更灵活的格式以便将正则表达式写得更易于理解

re.U

根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B

正则表达式重点

一、

r原生字符

将在python里有特殊意义的字符如\b,转换成原生字符(就是去除它在python的特殊意义),不然会给正则表达式有冲突,为了避免这种冲突可以在规则前加原始字符r

二、

正则表达式,返回类型为表达式对象的

如:<_sre.SRE_Match object; span=(6, 7), match=‘a’>

返回对象的,需要用正则方法取字符串,

方法有

group() # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来,有参取匹配到的第几个如2
groups() # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
groupdict() # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果

三、

匹配到的字符串里出现空字符

注意:正则匹配到空字符的情况,如果规则里只有一个组,而组后面是就表示组里的内容可以是0个或者多过,这样组里就有了两个意思,一个意思是匹配组里的内容,二个意思是匹配组里0内容(即是空白)所以尽量避免用否则会有可能匹配出空字符串
四、

()分组

注意:分组的意义,就是在匹配成功的字符串中,在提取()里,组里面的字符串
五、
在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()。
datetime
datetime模块以简单和复杂的方式提供用于操纵日期和时间的类。 虽然支持日期和时间算术,但实现的重点是有效的属性提取用于输出格式和操作。

datetime类定义的类属性与方法:

datetime.min、datetime.max:datetime所能表示的最小值与最大值;
datetime.resolution:datetime最小单位;
datetime.today():返回一个表示当前本地时间的datetime对象;
datetime.now([tz]):返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
datetime.utcnow():返回一个当前utc时间的datetime对象;
datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个datetime对象,参数tz指定时区信息;
datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象;
datetime.combine(date, time):根据date和time,创建一个datetime对象;
datetime.strptime(date_string, format):将格式字符串转换为datetime对象,data 与 time 类没有提供该方法。

使用示例:

datetime.datetime.min
datetime.datetime(1, 1, 1, 0, 0)

datetime.datetime.max
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)

datetime.datetime.resolution
datetime.timedelta(0, 0, 1)

print datetime.datetime.resolution
0:00:00.000001

today = datetime.datetime.today()
today
datetime.datetime(2016, 5, 12, 12, 46, 47, 246240)

datetime.datetime.now()
datetime.datetime(2016, 5, 12, 12, 47, 9, 850643)

datetime.datetime.utcnow()
datetime.datetime(2016, 5, 12, 4, 47, 42, 188124)

datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2016, 5, 12, 12, 48, 40, 459676)

datetime.datetime.combine(datetime.date(1990, 10, 05), datetime.time(18, 18, 18))
datetime.datetime(1990, 10, 5, 18, 18, 18)

datetime.datetime.strptime(“2010-04-07 01:48:16.234000”, “%Y-%m-%d %H:%M:%S .%f”)
datetime.datetime(2010, 4, 7, 1, 48, 16, 234000)

http请求
http或超文本传输​​协议适用于客户端服务器模型。通常,Web浏览器是客户端,托管该网站的计算机是服务器。在python中,我们使用requests模块来创建http请求。它是一个非常强大的模块,可以处理简单请求和响应数据之外的http通信的许多方面。它可以处理身份验证,压缩/解压缩,分块请求等。

HTTP客户端以请求消息的形式向服务器发送HTTP请求,其中包括以下格式:

请求行
零个或多个标题(General | Request | Entity)字段后跟CRLF
空行(即CRLF前面没有任何内容的行),表示标题字段的结尾
可选的消息体

请求方法
请求方法指示对由给定Request-URI标识的资源执行的方法。该方法区分大小写,应始终以大写形式提及。下表列出了HTTP / 1.1中支持的所有方法。
SN 方法和描述
GET 方法用于使用给定的URI从给定服务器检索信息。使用GET的请求应仅检索数据,并且不应对数据产生其他影响。
HEAD 与GET相同,但它仅传输状态行和标题部分。
POST 请求用于使用HTML表单向服务器发送数据,例如客户信息,文件上传等。
PUT 用上传的内容替换目标资源的所有当前表示。
DELETE 删除URI给出的目标资源的所有当前表示。
CONNECT 建立到给定URI标识的服务器的隧道。
OPTIONS 描述目标资源的通信选项。
TRACE 执行消息循环测试以及目标资源的路径。

请求URI
Request-URI是统一资源标识符,用于标识应用请求的资源。以下是指定URI的最常用表单:

Request-URI = “*” | absoluteURI | abs_path | authority

1

SN 方法和描述
1 当HTTP请求不适用于特定资源但使用服务器本身时,将使用星号*,并且仅当使用的方法不一定适用于资源时才允许使用星号*。例如: OPTIONS * HTTP/1.1
2 Request-URI的最常见形式是用于标识源服务器或网关上的资源。例如,希望直接从源服务器检索资源的客户端将创建到主机“www.w3.org”的端口80的TCP连接,并发送以下行:GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
3 Request-URI的最常见形式是用于标识源服务器或网关上的资源。例如,希望直接从源服务器检索资源的客户端将创建到主机“www.w3.org”的端口80的TCP连接,并发送以下行:GET /pub/WWW/TheProject.html HTTP/1.1; Host: www.w3.org

注意绝对路径不能为空; 如果原始URI中不存在,则必须以“/”(服务器根目录)给出。

使用Python模块requests请求

安装
pip install requests

import requests
r = requests.get(‘https://map.baidu.com/’)
print(r.text)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值