python----re模块 正则表达式

前戏:string匹配

string提供的是完全匹配

s = 'hello world'
 
ret = s.find('llo')    # 找到字母llo,运行后显示位置
print(ret)   # 2
 
ret1 = s.replace('ll','xx')    # 用 xx 替换 ll
print(ret1)   # hexxo world
 
ret2 = s.split('w')   # 以w为界限,分割字母,但w会被分割出去
print(ret2)   # ['hello ', 'orld']

什么是正则表达式:用一些定义好的特定字符,或者特定字符的集合,组成一个规则,用这个规则,对字符串进行过滤,通过 import re 来调用

一、常用函数

1. match() 函数:从起始位置匹配一个符合规则的字符串,匹配成功返回一个对象,未匹配成功返回None

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

2. search() 函数:查看整个字符串,匹配第一个符合规则的字符串,未匹配成功返回None

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

3. split() 函数:根据匹配模型分割字符串,返回分割后的列表

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

4. findall() 函数:查看整个字符串,匹配所有符合规则的字符串,把匹配到的字符串放到一个列表中,未匹配成功返回空列表

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

二、元字符介绍

1.  .  通配符 匹配任意一个字符,换行符\n除外

ret = re.findall('w..l','hello world')
print(ret)   # ['worl']

2.  ^  尖角符

ret = re.findall('^h...f','hjisfnlhello')   #只从最初开始匹配
print(ret)   # ['hjisf']

3.  $  从最后开始匹配

ret = re.findall('e..o$','hjisfnlalexhello')
print(ret)   # ['ello']

4.  |  表示或的意思,匹配前面或者后面

ret = re.findall('a|b','acbbcbaac')
print(ret)   # ['a', 'b', 'b', 'b', 'a', 'a']

5.  *  0个或多个字符,贪婪匹配,尽可能多取,取值范围[0,+oo] 贪婪匹配:尽可能多的取匹配

ret = re.findall('ba*','afdhfhnandbbbbbaaabaaaaaaaaa')
print(ret)   # ['b', 'b', 'b', 'b', 'baaa', 'baaaaaaaaa']

6.  \   转义符 改变后面字符的意思,使其失去特殊意义

val = re.findall('1.*','11*222223456')   # 没有使用转义符,*就会进行贪婪匹配
ret = re.findall('1.\*','11*222223456')  # 使用转义符,*就变成了一个普通字符
print(val)    # ['11*222223456']
print(ret)    # ['11*']

ret1 = re.findall('\\t','asdfa\tsd4654')  # 如果要匹配字符串中\t,需要在\t前加\,让\t中的\失去特殊意义
print(ret1)     # ['\t']

ret2 = re.findall(r'\t','asdfa\tsd4654')  # 也可以在‘’号前加r,让其不进行转义,效果同上
print(ret2)     # ['\t']

7.  +  取1个或多个字符,贪婪匹配,尽可能多取,取值范围[1,+oo]

ret1 = re.findall('ab+','afdhfhnandbabaaaaabbbaaabbaaa')
print(ret1)   # ['ab', 'abbb', 'abb']
ret2 = re.findall('a+b','afdhfhnandbabaabaaaaaaaaaab')
print(ret2)   # ['ab', 'aab', 'aaaaaaaaaab']

8.  ?   取0个或1个字符,贪婪匹配,尽可能多取,取值范围[0,1]

ret = re.findall('a?b','afdhfhnandbabaabbbaaaaaaaabaa')   #匹配到0-1个a
print(ret)  # ['b', 'ab', 'ab', 'b', 'b', 'ab']

9.  {x}   对前一个字符取x次

a = re.findall('a{5}b','aaaaaaaaaaaaab')  #匹配5个a,一个b
print(a)  # ['aaaaab']
b = re.findall('a{1,3}b','aaaaaaabbbbbbbbbb')  #至少有一个a才能匹配成功,最多3个a,非贪婪模式
print(b)  # ['aaab']

10.   [ ]   字符集合 可在括号中添加范围

ret = re.findall('[a-z]','adsoAHK12387farSDGKAgag')  # 取出字符串中的所有小写字母
print(ret)      # ['a', 'd', 's', 'o', 'f', 'a', 'r', 'g', 'a', 'g']

ret1 = re.findall('[A-Z]','adsoAHK12387farSDGKAgag')  # 取出字符串中的所有大写字母
print(ret1)     # ['A', 'H', 'K', 'S', 'D', 'G', 'K', 'A']

ret2 = re.findall('[0-9]','adsoAHK12387farSDGKAgag')  # 取出字符串中的所有数字
print(ret2)     # ['1', '2', '3', '8', '7']


ret3 = re.findall('[^A-Z]','adsoAHK12387farSDGKAgag')  # ^号表示取反,此处为取所有除大写字母外的字符
print(ret3)     # ['a', 'd', 's', 'o', '1', '2', '3', '8', '7', 'f', 'a', 'r', 'g', 'a', 'g']

11.   ( )   分组匹配

ret = re.findall('(ab){2}','abababab')  # 这里表示2个ab完成一次匹配,匹配出来的内容为ab
print(ret)   # ['ab', 'ab']

三、预定义字符

1.  \d  匹配任何十进制数,相当于 [0-9]

ret = re.findall('\d','adfadsf123123')
print(ret)   # ['1', '2', '3', '1', '2', '3']

2.  \d+   匹配一位或者多位数字

ret = re.findall('\d+','ad456456fadsf123123')
print(ret)   # ['456456', '123123']

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

ret = re.findall('\D','ad456__456fadsf123123')
print(ret)   # ['a', 'd', '_', '_', 'f', 'a', 'd', 's', 'f']

4.   \s   匹配任何空白字符,例如: \t \n \f \v 还有空格

ret = re.findall('\s','ad456__456  fadsf123\t12\n3')
print(ret)   # [' ', ' ', '\t', '\n']

5.   \S  匹配任何非空白字符,[^\t\n\f\v]还有空格

ret = re.findall('\S','ad_456  f13\t12\n3')
print(ret)   # ['a', 'd', '_', '4', '5', '6', 'f', '1', '3', '1', '2', '3']

6.   \w  匹配包括字母、数字、汉字、下划线,相当于 [a-zA-Z0-9]

ret = re.findall('\w','ad_456  f13\t12\n3')
print(ret)   # ['a', 'd', '_', '4', '5', '6', 'f', '1', '3', '1', '2', '3']

7.  \W  匹配"非"字母、数字、汉字、下划线,相当于 [^a-zA-Z0-9]

ret = re.findall('\W','ad_456  f13\t12\n3')
print(ret)   # [' ', ' ', '\t', '\n']

8.   \A   匹配字符串开头

ret = re.findall('\Aad....','ad_456  f13\t12\n3')
print(ret)   # ['ad_456']

9.   \Z   匹配字符串结尾

ret = re.findall('\d+\Z','ad_456  f13\t12\n333')
print(ret)   # ['333']

10.   \b     匹配位于开始或者结尾的空字符串

ret = re.findall(r'\b','\tad_45 6f1312333\n') # 中间的空格是上一个的结尾,第二个的开始,所以会匹配两次
print(ret)   # ['', '', '', '']

11.    \B   匹配不位于开始或结尾的空字符串

ret = re.findall('\d\B','ad_456  f13  12  3')  # 检索内容不能位于开头或者结尾
print(ret)   # ['4', '5', '1', '1']

你可能感兴趣的:(python基础,python,正则表达式,开发语言)