python2.7笔记
输入输出及NULL
输入 raw_input("输入提示")
输出 print
python的NULL None
函数导入
4种导入方式1
2
3
4import pandas
import pandas as pd #重命名为pd
from pandas import *
from pandas import funtion1
运算符
- 没有++ –
- 算数运算符 + - * / % ** //(表示整数除法,/在3.0只能表示浮点数除法)
- 关系运算符 == != < > <= >= <>(在3.0已经被淘汰 )
- 逻辑运算符 and or not (没有|| &&)
- 位运算符 & | ^ ~ << >>
- 成员运算符 in not in (判断是否包含)
- 身份运算符 is not is (判断地址是否相同)
运算符优先级
符号 | 意思 |
---|---|
** | 指数 (最高优先级) |
~ + - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
* / % // | 乘,除,取模和取整除 |
+ - | 加法减法 |
>> << | 右移,左移运算符 |
& | 位 ‘AND’ |
^ | | 位运算符 |
<= < > >= | 比较运算符 |
<> == != | 等于运算符 |
= %= /= //= -= += *= **= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
not or and | 逻辑运算符 |
变量
数字变量
类型:int long bool float complex(复数)
long 不固定长度,受限于虚拟内存
字符串变量
表现形式:‘str’ ‘’str’’ ‘’’str’’’
三引号可以保留字符串中的所有格式信息
字符串加 r或R 前缀表示不使用转义字符而是原生字符
字符串运算、索引、切片
字符串运算
str1+str2 拼接字符串
str*3 重复字符串
str in string 判断包含
字符串索引
从0开始,从前向后; str[0] 第一个字符
从-1开始,从后向前; str[-1] 倒数第一个字符
字符串切片
str[start:finish:countby] ———— 左闭右开
start: 切片开始位置,包括start索引对应字符(不设置,默认第一个字符)
finish: 切片结束位置,不包括end索引对应字符(不设置,默认最大索引+1)
countby:计数参数,若为2,隔一个字符取一个字符;若为-1,获得逆序输出(不设置,默认为1)ps.对于前两者参数有要求,start索引位置要位于end后,且符号相同
字符串方法
- dir(变量类型)
查看该变量类型所有方法 - str.replace(old,new)
生成一个新的字符串,用new替换所有old;可设定替换次数:max - str.find(str)
返回第一次出现子串的下标,找不到则返回-1;可设定查找范围:beg,end - str.isdigit()
字符串是否包含数字,ture,false - str.count(sub,start=0,end=len(string))
统计字符串内子串出现的次数;可以设定范围;左闭右开,len(string) != -1; - str.strip()
去掉字符串开始和结尾的空格回车;可设定自定义字符串sub,移除字符串中字符 - str.split()
str.split(分隔符,分割次数)
返回分割后的字符串列表,分隔符默认是所有空格(空格、换行、制表符等) - str.title()
生成一个新的字符串,所有单词首字母大写其他字母小写 - str.capitalize()
生成一个新的字符串,首字母大写其余小写(只有第一个字母) - str.upper()
生成一个新的字符串,全部大写 - str.lower()
生成一个新的字符串,全部小写
字符串格式化
字符串格式化输出 有两种方法:str.format()函数和类似C语言的%形式
str.format()
利用 {} : 两个符号格式化字符串:{}设定参数位置, :设定参数格式
{}:1
2
3
4
5
6
7
8
9
10
11
121.通过位置设定参数,可多次使用位置
'{1}{0}{1}'.format(1,2) ==> '212'
使用列表
>>> li = ['hoho',18]
'my name is {} ,age {}'.format(*li)
'my name is hoho ,age 18'
2.通过关键词设定参数(关键词不能为数字)
'{name}{id}'.format(id='1',name='2') ===> '21'
使用字典
>>> hash = {'name':'hoho','age':18}
'my name is {name},age is {age}'.format(**hash)
'my name is hoho,age is 18'
::1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
161.填充与对齐
**{:(填充字符)(对齐方式)(宽度)}**
填充字符: 只能指定一个字符,不指定的话默认使用空格
对齐方式: ^ < > 分别是 居中,左对齐,右对齐
宽度: 总宽度;(宽度奇数,居中偏左;宽度过小,不填充)
`'{:*>8}'.format('2015')`
2.精度与类型
**{:(.精度长度)f}**
.(精度长度): 长度为X的精度(4舍5入) 只能与f一起用
类型:f(float)
`'{:.2f}'.format(3.12342)`
**{:(类型)}**
b(二进制) o(八进制) d(十进制) x(十六进制) float类型无法用b 0 d x 表示
,(金额的千位分隔符) float类型留一位小数
`'{:d}.format(2015)'`
结合:`'{:0>8.2f}'.format(0.33)`
“” % ( )
另一种格式化字符串方法
例子"abc %s" % ('abc')
格式符——控制位置和格式1
2
3
4
5
6
7
8
9
10
11
12
13
14
15%% 字符"%"
%s 字符串 (采用str()的显示)
%r 字符串 (采用repr()的显示)
%c 单个字符
%b 二进制整数
%d 十进制整数
%i 十进制整数
%o 八进制整数
%x 十六进制整数
%e 指数 (基底写为e)
%E 指数 (基底写为E)
%f 浮点数
%F 浮点数,与上相同
%g 指数(e)或浮点数 (根据显示长度)
%G 指数(E)或浮点数 (根据显示长度)
添加格式控制1
2
3
4
5
6
7
8
9%[(name)][flags][width].[precision]类型
(name)为命名
flags:可以有**-,' '或0**。
不填写flags表示右对齐。
**-**:表示左对齐。
**' '**:为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。
**0**:表示使用0填充。
width:表示显示宽度,可以用*代替,在%后面作为参数填充
precision:表示小数点后精度,可以用*代替,在%后面作为参数填充
类型转换函数
字符与整数的转换(一个字符与ascii码)
字符转整数:ord()
整数转字符:chr()
python2.x关键词
1 | and del from not while as |
函数
函数调用
函数的参数可以设置默认值1
2
3def test(a=1,b=2,c=3):
print a,b,c
test() # 123
4种静态函数调用1
2
3
4
5
6
7
8
9
10
11
12#coding:utf8
def test(a,b,c):
print a,b,c
#元组x
x = (1, 2, 3)
#字典xx
xx={'a':1,'b':2,'c':3}
test(1,2,3) #123
test(a=1,b=2,c=3) #123 abc为函数变量,填错报错
test(*x) #123 元组转变,相当于式子1 ; list列表也可
test(**xx) #123 字典转变,相当于式子2
2种动态参数调用
*arg1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#coding:utf8
def test2(*args):
print type(args)
for i in args:
print i
test2(1)
test2(1,'a',None)
a=(1,'a',None)
test2(*a)
# <type 'tuple'>
# 1
# <type 'tuple'>
# 1
# a
# None
# <type 'tuple'>
# 1
# a
# None
**arg1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#coding:utf8
def test3(**args):
print type(args)
for k,v in args.items():
print k,v
dic={'k1':1,'k2':'a'}
test3(k1=1)
test3(k1=1,k2='a')
test3(**dic)
# <type 'dict'>
# k1 1
# <type 'dict'>
# k2 a
# k1 1
# <type 'dict'>
# k2 a
# k1 1
两种动态参数混用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27def test4(*arg1,**arg2):
for i in arg1:
print i
for k,v in arg2.items():
print k,v
test4(1)
test4(k1=1)
test4(100,200,k3=True)
a=(100,200)
b={'k3':True}
test4(a,b)
test4(*a,**b)
# 1
# k1 1
# 100
# 200
# k3 True
####下一个输出结果:a,b 被*arg1编成元组 ((100, 200), {'k3': True})
####都在第一个for中输出
# (100, 200)
# {'k3': True}
# 100
# 200
# k3 True
静态动态混用
*arg1 **arg2 可以不填参数,arg必须填1
2
3
4
5
6
7
8
9
10
11
12
13
14
15def test5(arg,*arg1,**arg2):
print arg
for i in arg1:
print i
for k,v in arg2.items():
print k,v
a=(100,200)
b={'k3':True}
test5(1)
test5(1,*a,**b)
# 1
# 1
# 100
# 200
# k3 True
Lambda函数
Lambda函数——快速定义单行函数
lambda (输入参数):表达式
输入参数:可以有多个,’,’隔开
表达式:表达式的处理结果为返回值1
2f=lambda x,y:x+y
print f(4,5) #9
map函数
map函数——序列映射函数
Map(函数,序列)
函数:一个函数
序列:可以多个
返回:处理后的对应序列
多个序列输入到一个函数返回一个序列1
2
3
4m=[1,2,3,4,5]
n=[1,2,3,4,5]
print map(lambda x,y:x+y,m,n)
#[2, 4, 6, 8, 10]
Reduce函数
Reduce函数——序列叠加函数
Reduce(函数,序列)
函数:一个函数
序列:一个序列
返回:值
从序列中从左到右依次取数,进入函数,返回值作为第一个参数继续进入,如此叠加1
2
3m=[1,2,3,4,5]
print map(lambda x,y:x+y,m)
#15
Filter函数
Filter函数——过滤函数
filter(函数,序列)
函数:一个函数
序列:一个序列
返回 函数返回结果为真的值 组成的序列1
2
3m=[1,2,3,4,5]
print filter(lambda x:x%2,m)
#[1, 3, 5] 此处是奇数返回1
Eval()函数
eval(str)
str:字符串
将字符串str当成有效的表达式来求值并返回计算结果。1
2
3m="1+2"
print eval(m)
#3
列表(序列、List)
动态数组,有序
数组的值可以是任意类型
字符串运算、索引、切片同样适用
基础操作
生成列表,创建列表副本1
2
3
4
5
6
7
8a=[1,'a',['abc',1],3] # 可嵌套
##列表解析 [表达式 for 变量 in 列表 if 条件]
a=[x for x in range(10)] # 0-9
a=[x**2 for x in range(1,6)] # 1,4,9,16,25
a=[x for x in range(1,5) if x%2==0] # [2,4]
##列表副本
b=a # b和a指向同一地址,牵一发而动全身
b=a[:] # b为一个新的列表不是跟a指向同一地址,就是切片[0:len(a)],切片是生成新的列表
添加、删除、插入(不返回新列表,在原列表操作)1
2
3
4
5list=[1,2]
list.append(3) # [1,2,3]
list.append([3,4]) # [1,2,[3,4]]
list.remove(1) # [2,[3,4]] 删除对应的值,不是索引,多相同值,移除接近头的
list.insert(1,-1) # [2,-1,[3,4]] 在索引为1的位置插入-1
取尾元素、反转、排序1
2
3
4
5
6
7
8
9list=[2,-1,3]
list.pop() # [2,-1] 返回尾元素 list删除尾元素
list.reverse() # [-1,2] 在原列表操作
re = list[::-1] # [-1,2]
a=[-3,1,2]
a.sort() # [-3,1,2] 默认从小到大
sorted(a) # [-3,1,2]
a.sort(key=abs) # [1,2,-3]
a.sort(key=lambda x : 1/x) # [-3,2,1]
enumerate()函数
为可遍历对象提供索引
返回[(索引0,值0),(索引1,值1)……]1
2
3
4
5
6
7m=[1,2,3,4]
for index,value in enumerate(m):
print index,value
# 0 1
# 1 2
# 2 3
# 3 4
嵌套列表
1 | x=[[5,4,7,3],[4,8,9,7],[5,1,2,3]] |
列表实例
1 | #一行输入多个数,保存在列表中 |
元组(tuple)
静态数组,不能修改,长度固定
索引,切片,len适用
元组与列表可以嵌套
基础操作
生成元组,赋值,交换1
2
3
4
5
6
7
8
9
10#生成
a=1,2,3,4 #(1, 2, 3, 4)
b=(5,'a',7.0,8) #(5, 'a', 7.0, 8)
#赋值
b=a # (1, 2, 3, 4) 因为不能修改 无所谓地址不地址吧?
#交换
a,c = c,a #相当于(a,c)=(c,a) 所以a,c 可以是任意类型
a,c='1 3'.split() #,的其他用法,但是此时得到a,c就不是元组
print a # 1
print c # 3
元组实例
1 | def add(x,y) |
字典
键值对
不支持切片,索引
基础操作
生成,访问,添加,删除1
2
3
4
5
6
7
8
9
10
11
12
13 #键不可重复不可变,数字,字符串,元组,不能是列表(可变)
#值是任意类型
#生成
dic={'name':'lala','id':1} #键名是字符串需要''
a=dict(name='liming',age=20) #键名是字符串不需要''
#访问
print dic['name'] # lala
#添加更新
dic['num']=1
dic.update({'ok':'1'}) #从b字典中更新a字典,如果键相同则更新,a中不存在则追加
#删除
del dic['ok']
dic.pop('num')
字典应用
1 | len(dic) #字典中键值对的数量 |
迭代
1 | for t in h.iteritems() |
集合
元素不重复,无序,不能枚举
不支持索引和切片操作
分为可变集合(set)和不变集合(frozen set)
基础操作
生成、添加、删除1
2
3
4
5
6
7
8
9
10
11
12
13#生成
x={'key1','key2'}
print x # set(['key2', 'key1'])
y=frozenset(['key1','key2'])
print y # frozenset(['key2', 'key1'])
k=[1,2,3,1,2,3]
l=set(k)
print l # set([1, 2, 3])
#添加
l.add('body') # set(['body', 1, 2, 3])
#删除
l.remove('body') # set([1, 2, 3])
l.discard('body') # set([1, 2, 3]) 删除不存在的元素。discard不抛出异常,remove抛出异常
集合运算
1 | # - 差集 |
文件读写
1 | f=open('test.txt','r') |
Zip函数
zip(list1,list2)
输入:任意多个(包括0个和1个)序列 元组也可
返回:各个序列相应索引组成的元组的列表
序列长度不一,最后有多少个元组,取最短的序列作为元组长度
0个序列时 返回空序列
1个序列时 返回一个值的元组组成的序列 如:[(1,),(2,)]
zip(*list)
把zip的结果作为list输入,相当于unzip()
把序列拆分,其中的元组作为序列重新zip,变为原来的序列对应的元组
Numpy
列表list元素可以是任何对象,保存指针,浪费内存cpu
python自带array——一维数组,没有运算函数
Numpy的两种基本对象:
ndarray:数组,存储单一数据类型的多维数组
ufuc:对数组进行处理的函数
ndarray对象
索引,切片适用
导入、生成1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34import numpy as np
#from numpy import *
##### 通过创建python序列,再通过array函数转化为数组
a=np.array([1,2,3,4],dtype=np.float) #dtype 设定元素类型,默认整数
print a # [ 1. 2. 3. 4.]
print a.dtype # float64
b=np.array([[1,2,3,4],[5,6,7,8]])
print b
#[[1 2 3 4]
# [5 6 7 8]]
##### numpy自带创建创建数组函数
#np.arange(start=0,end,step=1) 左包右开
g=np.arange(0,1,0.2) # [ 0. 0.2 0.4 0.6 0.8]
#np.linspace(start,end,num,endpoint=True(包括终值)) 等差数列
h=np.linspace(0,1,5,endpoint=False) # [ 0. 0.2 0.4 0.6 0.8]
#np.logspace(start,end,num,endpoint=True(包括终值)),base=10(底数)) 等比数列
#base^start~base^end 取num
j=np.logspace(0,1,2,base=2) # [ 1. 2.]
#全0
np.zeros((3,3))
#全1
np.ones((3,3))
#对角线为1,4*4
np.eye(4)
#随机数 元素值0-1的2*2的随机数组
np.random.rand(2,2)
#fromfuction(函数,尺寸) 生成乘法表
def func(i,j):
return (i+1)*(j+1)
table = np.fromfunction(func,(4,4))
# [[ 1. 2. 3. 4.]
# [ 2. 4. 6. 8.]
# [ 3. 6. 9. 12.]
# [ 4. 8. 12. 16.]]
ndarray函数
以下类似1,2 其实都是元组 (1,2)1
2
3
4
5
6
7
8
9
10
11
12
13#获取数组维数
print a.shape,b.shape # (4L,) (2L, 4L) 一维数组 4列 二维数组 2行4列
#元素不变情况下,定义数组尺寸
b.shape=4,2
print b
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
#创建改变数组尺寸的新数组
c=b.reshape(8,) # [1 2 3 4 5 6 7 8]
d=b.reshape(1,8) # [[1 2 3 4 5 6 7 8]]
## reshape生成的新数组其实共享数据存储区域,牵一发而动全身
存取数组
1 | #### 二维数组的切片取数 二维列表没有二维切片 |
where函数
元素依次进入,生成返回值数组
np.where(条件,真返回值,假返回值)1
2
3
4
5
6#coding:utf8
import numpy as np
arr=np.random.rand(2,2)
print np.where(arr>0.5,1,0)
[[1 0]
[0 0]]
cunsum函数、cumprod函数
对行(0)或列(1)累计求和、求列
ufunc运算
1 | np.sin(ndarray) #对于ndarray中的每个元素求正弦值 返回新数组 |
Pandas
Series 和 DataFrame 支持切片、筛选
Series
Series 类似于一维数组的对象,由一组数据以及相关的索引组成
生成、读取属性1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38from pandas import *
############从序列中生成
se=Series([1,2,3,4])
print se
#索引 数据
# 0 1
# 1 2
# 2 3
# 3 4
# dtype: int64
se=Series([1,2,3,4],index=['a','b','c','d'])
print se
# a 1
# b 2
# c 3
# d 4
# dtype: int64
#################从字典中生成
sdata={'num1':1,'num2':2,'num3':3}
obj2=Series(sdata)
print obj2
# num1 1
# num2 2
# num3 3
# dtype: int64
#################从字典中生成,按照index排序,重构
sdata={'num1':1,'num2':2,'num3':3}
states=['num2','num1','name']
obj2=Series(sdata,index=states)
print obj2
# 索引 数据
# num2 2.0
# num1 1.0
# name NaN
# dtype: float64
###########属性
print se.values,se.index
#[1 2 3 4] Index([u'a', u'b', u'c', u'd'], dtype='object')
读取数据
不支持切片取数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15obj=Series([1,2,3,4],index=['a','b','c','d'])
###########按照索引读取值
print obj['a']
# 1
###########按照索引序列读取行
print obj[['a','b']]
# a 1
# b 2
# dtype: int64
###########按照布尔Series取行
a=Series({'a':True,'b':True,'c':True,'d':False})
print obj[a]
# a 1
# b 2
# c 3
删除
del
只能删除一个 obj[‘’]1
2
3
4
5
6
7obj=Series([1,2,3,4],index=['a','b','c','d'])
del obj['a']
print obj
# b 2
# c 3
# d 4
# dtype: int64
drop
删除一个(‘’) 删除多个([‘’,’’])1
2
3
4
5
6from pandas import *
obj=Series([1,2,3,4],index=['a','b','c','d'])
print obj.drop(['a','b'])
# c 3
# d 4
# dtype: int64
筛选
numpy DataFrame 同理1
2
3
4
5
6
7
8
9print obj>pbj.median()
# a False
# b False
# c True
# d True
print obj[obj>obj.median()] #原理 按照布尔Series取数
# c 3
# d 4
# dtype: int64
isnull notnull函数1
2
3
4
5
6
7
8
9import pandas as pd
a={'ok':1,'go':2,'od':3}
obj=pd.Series(a,index=['ok','go','od','fi'])
print pd.isnull(obj)
ok False
go False
od False
fi True
dtype: bool
Series运算,索引取并集,索引相同之间运算,索引不同显示NaN
DataFrame
表格型数据结构
有行索引,有列索引
列的地位比行的高
生成
1 | ####################通过等长列表生成 |
DataFrame取值赋值 —— 变为Series
1 | # num1 num2 num3 |
选取
- 行切片
data[1:2]
选取行 - 布尔型序列
data[[True,False,True,False]]
选取行 - 布尔型DataFrame过滤
data[data<9]
返回原格式 不满足变为NaN - frame.ix[行索引] (行索引为一个时,结果为Series,多个用序列表示,返回DataFrame)
- frame.ix[:,列索引] (行索引为一个时,结果为Series,多个用序列表示,返回DataFrame)
- frame.ix[[行索引],[列索引]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14# num1 num2 num3
# one 1 5 9
# two 2 6 10
# three 3 7 11
# four 4 8 12
print frame.ix['one']
# num1 1
# num2 5
# num3 9
# Name: one, dtype: int64
print data.ix[['one','two'],['num1','num2']]
# num1 num2
# one 1 5
# two 2 6
重新索引
DataFrame 同理1
2
3
4
5
6
7
8
9
10se=Series([1,2,3],index=['one','two','three'])
print se
# one 1
# two 2
# three 3
se2=se.reindex(['one','b','c'],fill_value=0) #fill_value默认缺失值,默认为NaN
print se2
# one 1
# b 0
# c 0
排序
按照行列索引进行字典排序
axis=0 按照行索引 axis=1 按照列索引
ascending=True 按照升序 False 按照降序
frame.sort_index(axis=0,ascending=True)
文件加载、写入
将表格性数据读取为DataFrame对象
read_csv()
从文件、URL、文件型对象中加载带分隔符的数据,默认分隔符为逗号
read_table()
从文件、URL、文件型对象中加载带分隔符的数据,默认分隔符为制表符1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import pandas as pd
#####文件内容没有自带列索引,分配默认列名
df=pd.read_csv('文件路径',header=None)
#####文件内容没有自带列索引,自己定义列名
df=pd.read_csv('文件路径',names=['a','b','c','d'])
#####文件内容没有自带列索引,自己定义列名,指定一列内容作为行索引
df=pd.read_csv('文件路径',names=['a','b','c','d'],index_col='d')
##参数sep 指定拆分字符序列 或 正则表达式
##参数na_values=['NULL'] 指定缺失值 也可用字典指定每列不同值填充为缺失
##参数encoding=utf8 指定解码形式
#########文件写入到一个以逗号分隔的文件中
df.to_csv('文件路径')
##参数na_rep='NULL' 指定输出缺失值
##参数index=False 指定不写行索引
##参数header=None 指定不写列索引
##参数columns=[] 指定要写入的列索引名
##参数seq='|' 指定分隔符
正则表达式
导入模块1
2
3import re
s='123abc456eabc789'
print re.findall(r'abc',s,re.I)
命令
re.I : 忽略大小写
re.M : 多行匹配,影响^和$
re.S : 使.匹配包括换行在内的所有字符
特殊字符
‘.’ : 匹配除了换行符外的任意一个字符
‘^’ : 行首
‘$’ : 行末
‘\A’: 整个字符串开头
‘\Z’: 整个字符串结尾
‘\b’: 匹配单词的分割,一个单词的前后都有
‘\B’: [^\b]
‘|’ : 或,匹配子表达式中的一个,用()圈定范围,没用()则表示整个字符串
‘?’ : 表示?前一个元素是有可有无的,用()圈定元素
‘+’ : 表示+前一个元素出现一次或多次 >=1 ,用()圈定元素
‘‘ : 表示\前一个元素出现任意多次 >=0 ,用()圈定元素
‘+?’: 表示懒惰模式,满足之后的需求,+所匹配的次数尽可能少
‘?’: 表示懒惰模式,满足之后的需求,\所匹配的次数尽可能少
‘??’: 表示懒惰模式,满足之后的需求,?尽可能匹配0次
‘{min,max}?’: 表示懒惰模式,满足之后的需求,{}匹配的次数尽可能少
字符组 []
字符组:匹配字符组内的若干字符之一
如:[ae] 匹配 a或e
字符组中的两种特殊字符:
‘-‘ : 当’-‘不在字符组开头时,表示范围
如:[0-9][a-z][A-z] 等于 [0-9a-zA-Z]
‘^’ : 当’^’在字符组开头是,表示排除,匹配除了之后字符以外的字符
如:[^1-6] 除了1~6以外的字符
预定字符集(可以不写在[]中):
\d : 数字[0-9]
\D :非数字[^\d]
\s : 空白字符[ \t\r\n\f\v]
\S : 非空白字符[^\s]
\w : 单词字符[A-Za-z0-9_] #有下划线
\W : 非单词字符[^\w]
\number : 表示跟编号为number的括号()匹配内容相同的一个字符串 (不是表达式相同)
出现次数范围
限定{}前面的元素重现次数
{num} 固定次数
{min,max} 次数范围
如 [a-zA-Z]{1,5} 匹配1~5个大小写字母
? 等于 {0,1}
()
每个括号都有一个编号,从左往右,从1开始
1.记忆被匹配到的文本
多个()一一对应多个变量
2.用于|的多选项范围
()内加 ?: 不记忆这部分被匹配到的内容
3.用于? * +的量词作用范围
()内加 ?: 不记忆这部分被匹配到的内容
4.指定别名
(?P
(?P=name) 引用别名为name的分组匹配到的字符串
对于以上所有用到的特殊字符,用转义字符’\’来表示本身
如 ([a-z]+) ==> (very)
requests
//requests 包的使用
1.使用requests.get(url=urlforflag)
后者需要手动进行url加密 需要修改变量的地方断开使用字符串链接来构造payload
2.使用response=requests.get(url=url,params=data)
data = {“id”: sql_forflag % (i, x)}
data内的内容会被自动url加密;可以用response.url查看发送的真实url
3.使用response=requests.post(url=url,data=data,cookies=cookies)\
data = {“id”: sql_forflag % (i, x)}
cookies = {dict(PHPSESSID=’c3vg3kihmut0ne06ubhja3hgv6’,hello=’123’)}