Python学习_正则表达式模块re
正则表达式re模块介绍:
#!/usr/bin/env python # -*- coding:utf-8 -*- # 正则表达式 # 可以对find(),replace(),split()进行补充 # s = "aaddbbccxxxsssaa".replace("aa","pp",1) # print(s) import re # 字符匹配(普通字符):大多数普通字符和字母都会和自身匹配 # findall()拿到所有匹配的结果,并以"列表"list的形式返回 # res = re.findall("alex", "111alex222deifjgsfalextdingdg") # print(res) # 字符匹配(元字符):. ^ $ * + ? {} [] | () \ # . 通配符, 匹配除“\n”和"\r"之外的任何单个字符。 # 要匹配包括"\n"和"\r"在内的任何字符,请使用像"[\s\S]"的模式 # res = re.findall("alex.w","aaaaalexbw") # print(res) # # ^ 抑扬字符, 匹配以alex开头的字符串,规定匹配的起始位置 # res = re.findall("^alex","alexaaaaalex") # print(res) # # $ 抑扬字符, 匹配以alex结尾的字符串,规定匹配的结尾位置 # res = re.findall("alex$","alexaaaaalex") # print(res) # # * 匹配前面的表达式或字符0到任意次,贪婪匹配 # res = re.findall("alex*","aleaawwalexwwaaalexxxxxxxx") # print(res) # # + 匹配前面的表达式或字符1到任意次 # res = re.findall("alex+","aleaawwalexwwaaalexxxxxxxx") # print(res) # # ? 匹配前面的表达式或字符0到1次 # res = re.findall("alex?","aleaawwalexwwaaalexxxxxxxx") # print(res) # {} 匹配次数限制,{n} => 匹配n次,{n,} => 至少匹配n次,{n,m} => 至少匹配n次,至多匹配m次 # [] 字符集合, [^xyz]负值字符集合,匹配未包含的任意字符 = 除了x,y,z之外的所有字符 # [.()] .在字符集里面无意义 ()在字符集里面也无意义 # 【】里面符号不需要转义,【】具有特殊意义 # 反斜杠后边跟元字符去除特殊功能,变为普通字符 \. # 反斜杠后边跟普通字符实现特殊功能 \w \W \d \D \s \S # 反斜杠后边跟序号,引用前面子表达式所匹配的字符串 (alex)(eric)(dark)com\1\2\3 # \d 匹配一个数字字符, 它相当于 [0-9] # \D 匹配一个非数字字符, 它相当于 [^0-9] # \s 匹配任何不可见字符, 它相当于 [\f\n\r\t\v] # \S 匹配任何可见字符, 它相当于 [^\f\n\r\t\v] # \w 匹配包括下划线的任何单词字符。类似但不等价于 [A-Za-z0-9_] # 这里的"单词"字符使用Unicode字符集 # \W 匹配任何非字母数字字符, 等价于 [^A-Za-z0-9_] # \b 匹配一个单词边界, 也就是单词和空格间的位置 # ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。 # 非贪婪模式尽可能少地匹配所搜索的字符串 # 浏览全部字符串,匹配第一个符合规则的字符串 # serch().group() # res = re.search("alex","absdalexwwwwalexpp").group() # print(res) # match().group() 尝试从字符串的起始位置匹配,如果不是起始位置匹配成功的话, # match()就返回None。 # res = re.match("alex","22alex11").group() # print(res) # findall()拿到所有匹配的结果,并以"列表"list的形式返回 # findall()返回的是括号所匹配到的结果 # [可以通过?:去掉优先捕获] # res = re.findall(r"www.(?:baidu|alex).com","11122www.baidu.com") # res = re.search(r"www.(baidu|alex).com","11122www.baidu.com").group() # print(res) # 多个括号就会返回多个括号分别匹配到的结果 # 如果没有括号就返回就返回整条语句所匹配到的结果 # 所以在提取数据的时候就需要注意这个坑 # res = re.findall(r"(\d+)alex(\d+)","22alex11") # print(res) # res = re.findall(r"\([^()]*\)","1*(2+3-4*5)-2*3") # print(res) # res = re.search(r"alex(\d+?)","22alex1122334455").group() # print(res) # 分组 使用【\序号】可以引用前面的子表达式 # \1\2\3 Back 引用 是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列。 # 注意:反向引用,引用的是前面捕获组中的文本而不是正则, # 也就是说反向引用处匹配的文本应和前面捕获组中的文本相同,这一点很重要。 # res = re.search(r"(cs)(\d*?)(dark)com\3", "cs111222darkcomdark").group() # print(res) # 匹配模式 # re.I 匹配大小写 # re.L 做本地化识别 # re.M 多行匹配,影响^和$ # re.S 使.匹配包括换行在内的所有字符,全局匹配 # res = re.findall(r"alex","alex11",re.S) # 注意:re.match() 和 re.search() 一旦匹配成功 # 就是一个 match object 对象 # group(参数) 返回被 RE 匹配的字符串,参数默认为0,返回总结果 # res = re.search("([0-9]*)([a-z]*)([0-9]*)","123abc456") # print(res.group(0)) # print(res.group(1)) # print(res.group(2)) # print(res.group(3)) # print(res.groups()) # 正则替换 sub(pattern, repl, string, count=0, flags=0) # count 默认等于0, 替换所有的, 设置为1, 则替换1次 # res = re.sub("\d+", "xxx", "123gggbbbttt456ppp", re.S) # print(res) # re.compile(pattern, flags=0) Pattern类的工厂方法 # 用于将字符串形式的正则表达式 转换为 Pattern 对象 # 正则分割 # p = re.compile(r"\d+") # res = p.split("one1two2three3four4") # print(res) # # res = re.split("[bc]", "abcd") # print(res) # # text = "jdood is a good thing" # regex = re.compile(r"\w*oo\w*") # print(regex.findall(text)) # 匹配加减乘除 # \d+.?\d* 匹配小数点前面的数字 res = re.search("\d+\.?\d*([*/]|\*\*)\d+\.?\d*","1*(2+3-4*5)-2*3") print(res.group()) # 匹配ip地址 res = re.search(r"(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}\2","10.1.1.1") print(res.group(0)) # finditer() 返回结果的迭代对象,需要循环取出 p = re.compile(r"\d+") res = p.finditer("asd21dtyfri45nvs13") print(res) for r in res: print(r) # print(r.span(),r.group()) # 匹配单词边界\b t = re.findall(r"I\b"," I MISS IOU") print(t)
更深入的理解正则表达式的分组
#!/usr/bin/env python # -*- coding:utf-8 -*- import re # search() 和 match() 基本一模一样,一个全局匹配一个从头开始 # 无分组 # origin = "hello alex bcd alex lge alex acd 19" # r = re.match("h\w+", origin) # print(r.group()) # 获取匹配到的所有结果 # print(r.groups()) # 获取模型中匹配到的分组结果 # print(r.groupdict()) # 获取模型中匹配到的分组结果 # 为何要有分组?提取匹配成功的指定内容(先匹配全部正则,再匹配成功的局部内容提取出来) # 有分组 # origin = "hello alex bcd alex lge alex acd 19" # r = re.search("a(?P<Name1>\w+).*(?P<Name2>\d)$", origin) # print(r.group()) # 获取匹配到的所有结果 # print(r.groups()) # 获取模型中匹配到的分组结果 # print(r.groupdict()) # 获取模型中匹配到的分组所有执行了key的组 # findall(pattern, string, flags=0) # 如果没有分组就是获取的所有匹配结果的的LIST # res = re.findall("\d+\w\d+", "a2b3c4d5") # print(res) # res = re.findall("", "a2b3c4d5") # print(res) # 如果有分组就是获取的search()里面的groups()的LIST # origin = "hello alex bcd alex lge alex acd 19" # r = re.findall("(a)((\w)+)(x)", origin) # r1 = re.search("(a)((\w)+)(x)", origin) # print(r1.group()) # print(r1.groups()) # print(r) # finditer(pattern, string, flags=0) # 返回结果的迭代对象,需要循环取出 # origin = "hello alex bcd alex lge alex acd 19" # r = re.finditer("(a)((\w)+(e))(?P<Name>x)", origin) # for i in r: # print(i.span(), i.group(),i.groups(),i.groupdict()) # # 分组匹配如果有重复,只提取最后一个分组,可加?:进行查看 # r = re.findall(r"(\d+asd)*", "1asd2asd3asd875yfh") # # print(r) # # *为0的时候,匹配到最后一个"" # n1 = re.findall("(\w)*", "alex") # print(n1) # ['x', ''] # n2 = re.findall("(\w)(\w)(\w)(\w)", "alex") # print(n2) # [('a', 'l', 'e', 'x')] # split(pattern, string, maxsplit=0, flags=0) # 正则分割 # origin = "hello alex bcd alex lge alex 19" # 无分组, 直接返回根据匹配字符串分割后的LIST # n = re.split("a\w+", origin, 2) # print(n) # 有分组, 会将匹配的字符串也返回到结果里面 # origin = "hello alex bcd alex lge alex 19" # n = re.split("a(\w+)", origin, 1) # print(n) # 计算器使用 split()正则分割更简单 # origin = "1-2*((60-30+(40.0/5)*2)*(9-2*5/4 + 4*3/6)+100)" # # def f1(middle): # return 1 # # while True: # print(origin) # res = re.split("\(([^()]*)\)", origin, 1) # if len(res) == 3: # # before = res[0] # # middle = res[1] # # after = res[2] # # 简写方式 # before,middle,after = res # r = f1(middle) # new_str = before + str(r) + after # origin = new_str # else: # r = f1(origin) # print(r) # break # sub(pattern, repl, string, count=0, flags=0) origin = "lsj22fgiw33djiwo444" res = re.sub("\d+", "KKK", origin) print(res) res,count = re.subn("\d+", "KKK", origin) print(res,count)