一,正则表达式(http://tool.chinaz.com/regex/)
正则表达式本身与python没什么关系,就是匹配字符串内容的一种规则,只和字符串相关。
定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特殊字符、及这些特殊字符的组合,组合一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
1,字符组,[字符组],在同一位置可能出现的各种字符组成一个字符组,在在正则表达式中用[]表示。
2,元字符:. , 匹配除换行符以外的任意字符
w,匹配字符或数字或下划线,W,匹配非字母或下划线或数字
s,匹配任意空白字符,S,匹配非空白字符
d,匹配数字, D,匹配非数字
,匹配一个换行符, ,匹配一个制表符,,匹配一个单词的结尾
^,匹配字符串的开始,$,匹配字符串的结尾,a|b,匹配字符a或字符b
(),匹配括号内表达式,也表达一个组
[...],匹配字符组中的字符,[^...],匹配除了字符组中字符的所有字符
3,量词
*,+,?,{n},{n,},{n,m},默认情况下,采用贪婪匹配。尽可能匹配长的字符串。
在量词后面加?,就是非贪婪匹配,尽可能匹配短的字符串。
转义符,python中,在字符串前加r,例r“d”
.*?的用法:.*?x,就是取前面任意长度的字符,直到一个x出现
二,re模块
re模块下的常用方法
import re # ret=re.findall("s","she is girs") #返回所有满足匹配条件的结果,放在列表里 # print(ret) # ret=re.search("s","zhe is girs").group() #函数会在字符串内查找,只找到第一个匹配,就返回一个包含信息的对象,该对象可以 # print(ret) #通过调用group()方法得到匹配的字符串,如果没有,则返回None,调用group会报错 # ret=re.match("a","zhe is girs") #和search一样,但在字符串开始处匹配,匹配不到,就没有,报错 # print(ret.group()) # ret=re.split("[ab]","abdf") #先按"a"分割得到""和"bdf",再对""和"bdf"分别按"b"分割,结果['', '', 'df'] # print(ret) #如果不加中括号,则按"ab"分割,结果['', 'df'] # ret=re.subn("d","r","we1rer23g4") #将数字替换成"r",返回元组(替换的结果,替换了多少次(可设置)) # print(ret) # see=re.compile("d{3}") #将正则表达式编译成为一个正则表达式对象,规则要匹配的3个数字 # ret=see.search("asd34r345rr") # print(ret.group()) #345 # ret=see.sub("d","r","we1rer23g4",1) #将数字替换成"r",参数1表示只替换一个 # print(ret) # ret=re.finditer("d","da3gf4h4") #finditer返回一个存放匹配结果的迭代器 # print(ret) #<callable_iterator object at 0x000000A9CF8800F0> # print(next(ret).group()) # print(next(ret).group()) # print([i.group()for i in ret]) # for i in ret: # print(i.group())
优先级
#findall的优先级 # ret=re.findall("www.(biadu|oldboy).com","www.oldboy.com") # print(ret) #['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 # # ret=re.findall("www.(?:biadu|oldboy).com","www.oldboy.com") # print(ret) #['www.oldboy.com'] # split的优先级 # ret=re.split("d","eva4your3yuan2she") # print(ret) #['eva', 'your', 'yuan', 'she'] # ret=re.split("(d)","eva4your3yuan2she") # print(ret) #['eva', '4', 'your', '3', 'yuan', '2', 'she'] # #在匹配部分加上()之后所切出来结果是不同的 # #没有()的没有保留所匹配的项,但有()的可以保留匹配的项