Python-正则表达式
一、正则表达式:制定一个匹配规则,找出符合这个规则的字符串
1、元字符
. #匹配除换行符以外的任意字符 \w #匹配字母或数字或下划线或汉字 \W #匹配任何非字母数字或下划线或汉字 \s #匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等 \d #匹配数字 \D #匹配非数字字符 \b #匹配一个开始或结束的位置 ^ #匹配字符串的开始,如果放在字符串的开头,则表示取非。 [^x] #匹配除了x之外的任何字符 $ #匹配字符串的结束
2、匹配次数
* #重复零次或多次 + #重复一次或更多次 ? #重复零次或一次 {n} #重复n次 {n,} #重复不少于n次 {n, m} #重复n到m次
3、懒惰限定符
*? #重复零次或多次,但尽可能减少重复 +? #重复一次或更多次,但尽可能减少重复 ?? #重复零次或一次,但尽可能减少重复 {n,}? #重复不少于n次,但尽可能减少重复 {n, m}? #重复n到m次,但尽可能减少重复
4、范围
[ ] #用来匹配一个指定的字符类别 [0-9] #匹配0~9的数字,同\d [a-z] #匹配所有的小写字母 [A-Z] #匹配所有的大写字母 [a-zA-Z] #匹配所有的字母 [a-z0-9A-Z] #等同于[a-z|0-9|A-Z]
5、[ ] 和 | 的区别
str1 = 'aaabbb' obj = re.findall(r'[ab]', str1) #只匹配一个字符a或者b obj1 = re.findall(r'a|b', str1) #只匹配一个字符a或者b obj2 = re.findall(r'[ab]+', str1) #匹配a或者b,可匹配多次;所以结果可包含a和b obj3 = re.findall(r'a+|b+', str1) #匹配多个a或者多个b;所以结果只能是多个a或者多个b print('obj: ', obj) print('obj1: ', obj1) print('obj2: ', obj2) print('obj3: ', obj3)
查看结果:
obj: ['a', 'a', 'a', 'b', 'b', 'b']
obj1: ['a', 'a', 'a', 'b', 'b', 'b']
obj2: ['aaabbb']
obj3: ['aaa', 'bbb']
二、匹配函数
1、match( ) / search( ) / findall( )
str1 = "Cats are so cute.Dogs are so cute.Cats are so cute." Obj = re.match(r'(\w+) are so (\w+)', str1) #re.match()只从头开始匹配 Obj1 = re.search(r'(\w+) are so (\w+)', str1) #re.search()在整个字符串匹配,但只返回第一次匹配到的结果 Obj2 = re.findall(r'(\w+) are so (\w+).', str1) #re.findall()在整个字符串匹配,返回所有匹配到的结果 if Obj: print("Obj.group() : ", Obj.group()) #re.match()和re.search()要用group()获取结果 print("Obj.group(1) : ", Obj.group(1)) #若存在分组,group()保存匹配的整个字符串;group(i)保存分组内的字符串 print("Obj.group(2) : ", Obj.group(2)) else: print("No match!!")
查看结果:
Obj.group() : Cats are so cute
Obj.group(1) : Cats
Obj.group(2) : cute
2、group( ) 和 groups( )
str1 = "Cats are so cute.Dogs are so cute.Cats are so cute." Obj = re.match(r'(\w+) are so (\w+)', str1) #re.match()只从头开始匹配 Obj1 = re.search(r'(\w+) are so (\w+)', str1) #re.search()在整个字符串匹配,但只返回第一次匹配到的结果 Obj2 = re.findall(r'(\w+) are so (\w+).', str1) #re.findall()在整个字符串匹配,返回所有匹配到的结果 print("Obj.group() : ", Obj.group()) #group()显示整个匹配的字符串 print("Obj.groups() : ", Obj.groups()) #groups()只显示分组内的字符串 print("Obj1.groups() : ", Obj1.groups()) print("Obj2 : ", Obj2) #若存在分组,findall()只显示分组内的字符串
查看结果:
Obj.group() : Cats are so cute
Obj.groups() : ('Cats', 'cute')
Obj1.groups() : ('Cats', 'cute')
Obj2 : [('Cats', 'cute'), ('Dogs', 'cute'), ('Cats', 'cute')]
3、compile( )
#match()/search()/findall():先自动编译正则表达式,再用编译后的正则表达式去匹配字符串 res = re.compile(r'\w+ are so \w+') #若一个正则表达式要多次匹配,可先手动编译,提高效率 obj = res.findall(str1)) #等同于: obj = re.findall(r'\w+ are so \w+', str1)
4、span( )获取匹配字符串的下标
>>> str2 = 'Cats are so,,, cute' >>> print(re.search('\w{4}', str2).span()) #只有match()和search()支持span(),findall()不支持
(0, 4)
三、split( ) 分割字符串:可指定多个字符串进行分割
>>> str2 = 'Cats are so,,, cute' >>> obj4 = re.split(r'\W+', str2) >>> obj5 = re.split(r'[\s,]+', str2) >>> print(obj4) ['Cats', 'are', 'so', 'cute'] >>> print(obj5) ['Cats', 'are', 'so', 'cute']
四、sub( ) 和 subn( ) 替换匹配的字符串
str1 = 'Cats are so cute' obj = re.sub('\s', '-', str1, 0) #匹配str1中的所有空格替换成-; 最后一个参数默认为0,表示替换所有 obj1 = re.sub('\s', '-', str1, 2) #最后一个参数指定为2,表示只替换2次 obj2 = re.subn('\s', '-', str1, 0) #返回一个元组(替换后的字符串, 替换次数) obj3 = re.subn('\s', '-', str1, 2) print('obj: ', obj) print('obj1: ', obj1) print('obj2: ', obj2) print('obj3: ', obj3)
查看结果:
obj: Cats-are-so-cute
obj1: Cats-are-so cute
obj2: ('Cats-are-so-cute', 3)
obj3: ('Cats-are-so cute', 2)