正则表达式的学习

作用:
	开发数据抓取、网络爬虫等程序。
语法:
	import re
	re.__all__
	查看正则表达式可调用的函数
函数:
	p=re.compile(pattern,flags=0)
	pattern		是正则表达式
	flag		匹配的旗标,在后面会介绍(re.I,re.S等等)
	编译正则表达式,一次编译,终身使用,对于处理多个相同操作的数据,可以使用这种方式,节省代码。
	以后使用就可以直接p.search(str)
正则函数:
	re.match(pattern,string,flags=0)			从字符串的头匹配
	string		要匹配的字符串
	返回_sre.SRE_MATCH对象
	span()		返回匹配到的位置
	group()		返回匹配到的内容
	示例:
		a=re.match(r'a','a')					前面的r只是为了表示原始字符串,可以没有的
		<re.Match object; span=(0, 1), match='a'>
		a.span()			=>(0,1)
		a.group()			=>a
	注意:匹配不到调用这两个方法会报错,匹配不到返回None
	
	re.search(pattern,string,flags=0)			在字符串的全局匹配
	同上,一样,找到一次就返回,不找第二个
	
	re.findall(pattern,string,flags=0)			返回所有能匹配组成的列表
	示例:
		re.findall(r'a','a a a')
		['a','a','a']
	
	re.finditer(pattern,string,flags=0)			返回所有能匹配到的组成的迭代器
	示例:
		re.finditer(r'a','a a a')
		<callable_iterator object at 0x00C6B7B0>
		
	re.fullmatch(pattern,string,flags=0)		所有的相同就返回
	示例:
		re.fullmatch(r'a','a')
		<re.Match object; span=(0, 1), match='a'>
		注意:如果多个就不能匹配到
	
	re.sub(pattern,repl,string,count=0,flags=0)	将匹配的替换成repl,count控制替换几个
    返回字符串
    
    re.split(pattern,string,maxsplit=0,flags=0)		划分字符串
    返回划分好由列表组成的字符串
    
    re.purge()									清除正则表达式缓存
    
    re.escape(pattern)							对模式中除了ASCII字符、数值、下划线之外的其他字符转义
    示例:
      	print(re.escape(r'A-Zand0-0?'))
        A\-Zand0\-0\?
起组名:
	r'(?P<lang>\w+)
	分析:
		正则表达式用圆括号表达式建了一个组
		在组中,?P表示为该组起名,<lang>就是该组的名,后面跟要匹配的正则表达式。
补充:
	在search()、match()、fullmatch()、findall()、finditer()方法都可以额外指定pos(匹配的起始位置)和endpos(匹配的结束位置),不过得先compile编译,再用flags就得需要关键字传参了
	示例:
		p=re.compile('a')
		p.search('a b a',4)
		<re.Match object; span=(4, 5), match='a'>

_sre.SRE_Match对象

包含以下属性或者方法:
				match.group([group1,···])	获取该匹配对象中指定组所匹配的字符串,不写参数代表全部,写参数代表第几个组中的字符串
				match.groups(default=None)	返回所有组匹配组成的列表
				match.groupdict(default=None)返回所有组匹配到组成的字典
				得先给组起名字,字典的组成是{组名字:匹配到的内容}
				实例:
					m2=re.search(r'(?P<prefix>fkit).(?P<suffix>org)',r"www.fkit.org is good")
					m2.groupdict()
					{'prefix': 'fkit', 'suffix': 'org'}
					
				match.start([group])		返回组匹配到的起始位置
				match.end([group])			返回组匹配到的结束位置
				match.span([group])			返回组匹配到的起始和结束位置

组的概念:
	在正则表达式中,用括号括起来的就是一个组(下标从1开始,0代表所有组【默认不写】)
	
查看设置参数的函数:
	match.pos:		返回设置的起始位置
	match.endpos:	返回设置的结束位置
	match.lastindex:返回最后有个匹配组的索引
	match.lastgroup:返回最后一个组的名字
	match.re:		返回执行正则表达式的flag
	match.string:	返回正则表达式匹配的字符串

正则表达式的旗标

re.A或re.ASCII		 控制所有的,只匹配ASCII,可在正则表达式里面使用(?a)来代表
re.DEBUG			 显示编译正则表达式的debug信息,无行内旗标
re.I或re.IGNORECASE	 不区分大小写(?i)
re.L或re.LOCALE		 根据当前区域设置使用不区分大小写。只能对bytes模式起作用(?L)
re.M或re.MULTILINE	 多行模式的旗标,^、$能匹配多行的开头和结尾等(?m)
re.S或者s.DOTALL		让点能匹配换行符(?s)
re.U或者re.Unicode	匹配所有的Unicode,在python3是多余的,python默认就是Unicode
re.X或re.VERBOSE		 允许分行书写正则表达式(?x)可以添加注释·

(?i)写在全局表示对全局起作用

写在 组里面表示对当前组起作用

(?-i)表示在当前组里面去掉

正则表达式支持的合法字符

字符

解释

x

字符x(任意的合法字符)

\uhhhh

十六进制0xhhhh所代表的Unicode字符

\t

制表符(’\u0009’)

\n

换行符(’\u000A’)

\r

回车符(’\u000D’)

\f

换夜符(’\u000C’)

\a

报警(bell)符(’\u0007’)

\e

Escape符(’\u001B’)

\cx

x对应的控制符。例如,\cM匹配Ctrl+M。x值必须为a-z或A-Z之一

特殊字符

特殊字符

说明

^

匹配行首(若要匹配,须转义)

$

匹配行尾(同上)

()

组(同上)

[]

表示要匹配的范围(同上)

{}

出现频度(同上)

*

零次或多次(贪婪)

+

一次或多次(贪婪)

?

零次或一次

.

除了换行符之外的所有

\

转义字符

|

或,两者之任一

预定义字符

预定义字符

说明

.

除了换行符,在使用re.S(s.DOTALL)之后还可以匹配换行符

\d

匹配数字(digit)

\D

匹配非数字

\s

匹配只要是空白(space)

\S

除了空白

\w

字母数字下划线(word)

\W

非上一个

方括号表达式

方括号表达式

说明

表示枚举

[abc]表示abc任意一个

表示所有

[a-z]从a到z

表示求否:^

[^a]除了a之外所有的

边界通配符

说明

^

行的开头

$

行的结尾

\b

单词的边界,只能匹配单词前后的空白

\B

非单词的边界,即只能匹配不在单词前后的边界

\A

只匹配字符串的开头

\Z

只匹配字符串的结尾,用于最后的结束符

子表达式

(exp):表示匹配exp表达式,并捕获成一个自动命名的组,可以从\1,\2取
		例如:
			re.search(r'(a|b|c) \1','a a')
			<re.Match object; span=(0, 3), match='a a'>
			
		(?P<name>exp):为匹配的起别名,后面可通过(?P=name)匹配前面匹配到的
		
		(?:exp):匹配但不捕获,所以不能通过\1引用
		
		(?<=exp):左边的必须出现,但exp不作为匹配的一部分
		(?=exp):右边的必须出现,但不匹配
		
		(?<!exp):必须不出现在左边
		(?!exp):必须不出现在右边
		
		(?#comment):注释组,可以对前面的注释
		
		(?旗标):旗标组,可以指定旗标,用在整个正则表达式
		(?旗标:exp):子旗标组,用在当前的表达式中
		(?-旗标:exp):表名去掉旗标

贪婪模式与勉强模式

贪婪模式:
		是指在正则表达式中,如果不指定?,他会尽可能多的匹配,也就是只要能满足正则表达式,他会一直匹配下去,满足条件最大限度的匹配

勉强模式:
		是贪婪模式的对立面,是尽可能的少匹配,只要满足正则表达式,能少匹配就少匹配
		满足条件最小限度的匹配
两者的转化就在于:
		贪婪模式的正则表达式后面加个(?)就是勉强模式