一、简单的正则匹配
import re a = "c++|c#|java|python|js|php" # findall()的格式:re.findall("正则表达式规则", "源字符串") # 将匹配到的所有字符全是展示出来,结果是一个列表 res = re.findall('python', a) print(res) # ['python']
二、概括字符集
# 正则是一个字符一个字符匹配的 # \d ----> [0-9] 匹配数字 # \D ----> [^0-9] 匹配非数字 # \w ----> [a-zA-Z0-9_] 匹配数字字母(大小写)下划线 # \W ----> [^a-zA-Z0-9_] 匹配非数字字母(大小写)下划线 # \s ----> [ \f\n\r\t\v] 匹配任何不可见字符,包括空格、制表符、换页符等等 # \S ----> [^ \f\n\r\t\v] 匹配任何可见字符
# . ----> 匹配除换行符\n之外所有的字符
三、匹配字符的长度
# 匹配的长度 # * ---->表示匹配0次或者无限次 # + ---->表示匹配1次或者无限次 # ? ---->表示匹配0次或者1次 # {n,m} ---->表示最短n次,最长m次 s3 = 'pytho0python89pythonn' res3 = re.findall('python*', s3) res4 = re.findall('python+', s3) res5 = re.findall('python?', s3) res6 = re.findall('python*?', s3) print(res3) # ['pytho', 'python', 'pythonn'] print(res4) # ['python', 'pythonn'] print(res5) # ['pytho', 'python', 'python'] print(res6) # ['pytho', 'pytho', 'pytho']多加了一个?表示匹配最小的次数(在这里是0次)就结束了
a = 'JavaScript3_2,php*7 %python32!@' res = re.findall('[a-zA-Z]{3,10}', a) print(res) # ['JavaScript', 'php', 'python'] # 这里存在一个贪婪匹配
四、贪婪和非贪婪
在python中,默认是贪婪模式
# 与第三条形成对比 a = 'JavaScript3_2,php*7 %python32!@' res = re.findall('[a-zA-Z]{3,10}?', a) print(res) # ['Jav', 'aSc', 'rip', 'php', 'pyt', 'hon']
另一个例子
# 贪婪模式(python中是默认贪婪模式) s2 = 'abcabc' res2 = re.findall('a.*c', s2) print(res2) # ['abcabc'] # 非贪婪模式(在匹配长度后边加上一个?) s1 = 'abcabc' res1 = re.findall('a.*?c', s1) print(res1) # ['abc', 'abc']
五、边界字符 匹配
# 边界匹配符 # ^ ---->从字符串开头开始匹配 # $ ---->以字符串末尾作为匹配结束 s4 = '100000001' res8 = re.findall('\d{4,8}', s4) res9 = re.findall('^001{4,8}', s4) res10 = re.findall('100$', s4) print(res8) # ['10000000']默认是贪婪匹配 print(res9) # [] print(res10) # []
六、字符组合(组)的重复限制
s = 'PythonPythonPythonPythonPython' res1 = re.findall('(Python){2}', s) res2 = re.findall('Python{1,3}', s) print(res1) # ['Python', 'Python'] print(res2) # ['Python', 'Python', 'Python', 'Python', 'Python']
七、findall()函数第三个参数讲解,匹配模式
re.I # 忽略大小写
re.S # 匹配所有的字符,包括换行符\n 会将.匹配上换行符\n
lan = 'PythonC#\nJavaPhp' res1 = re.findall('c#', lan) res2 = re.findall('c#', lan, re.I) res3 = re.findall('c#.{1}', lan, re.I) res4 = re.findall('c#.{1}', lan, re.I | re.S) # 其实的 | 代表的且,不是或 print(res1) # [] print(res2) # ['C#'] print(res3) # [] print(res4) # ['C#\n']
八、re模块其他的函数
1、sub()函数
s = 'PythonPhpC#JavaC#JavascriptC#' # 替换函数sub( 正则表达式, 需要替换的内容, 原始字符串, [替换次数(默认为0表示全部替换)], [匹配模式(默认为0)] ) res1 = re.sub('C#', 'Go', s) res2 = re.sub('C#', 'Go', s, 1) print(res1) # PythonPhpGoJavaGoJavascriptGo print(res2) # PythonPhpGoJavaC#JavascriptC# # sub()第二个参数还可以是一个函数,匹配到多少次就调用该函数多少次 def convert(value): # print(value) # < _sre.SRE_Match object;span = (9, 11), match = 'C#' > 说明value是一个对象 match = value.group() # 使用group()取出sub()匹配到的字符串,即C# return '*%s*' % match res3 = re.sub('C#', convert, s) print(res3) # PythonPhp*C#*Java*C#*Javascript*C#*
小例子

# 将大于等于6的数字转为9,将小于6的数字转为0 str1 = 'Abc872DE4F582gh' def convert(value): match = value.group() if int(match) >= 6: return '9' else: return '0' res = re.sub('\d', convert, str1) print(res)
2、match()函数和search()函数
match()从字符串的开头 开始匹配,匹配到一个之后就停止
search()搜索的进行匹配,不一定是从第一个字符开始匹配,一样是匹配到一个之后就停止
s = '83C72D1D8E67' res1 = re.match('\d', s) print(res1.group()) # 8 匹配不到会抛出异常 res2 = re.search('\d', s) print(res2.group()) # 8 匹配不到也会抛出异常
3.group()函数和groups()函数,是针对于组来说的
s = 'life is short, i use python yes' res = re.search('life(.*)python(.*)', s) print(res.group()) # life is short, i use python yes 默认取第一组,也就是原始字符串 print(res.group(0)) # life is short, i use python yes 组的下表从0开始,第一个就是原始字符串 print(res.group(1)) # is short, i use 取出第二组匹配到的字符串 print(res.group(2)) # yes 取出第三组匹配到的字符串 print(res.groups()) # (' is short, i use ', ' yes') 取出所有非原始字符串的所有组,结果是元组的形式