目录
- 1. 反向引用_命名分组
- 2. 正则函数
- 小提示:编程客栈
- 总结
1. 反向引用_命名分组
# ### 反向引用 import re strvar = "<div>明天又要休息了</div>" obj = re.search("<(.*?)>(.*?)<(.*?)>",strvar) print(obj) # 获取匹配到的内容 res1 = obj.group() print(r编程客栈es1) # 获取分组里的内容 res2 = obj.groups() print(res2) # 反向引用的语法 \1把第一个括号里面匹配到的内容在引用一次 obj = re.search(r"<(.*?)>(.*?)</\1>",strvar) print(obj) print(obj.group()) print(obj.groups()) strvar = " z3d4pzd a1b2cab " obj = re.search(r"(.*?)\d(.*?)\d(.*?)\1\2",strvar) print(obj) print(obj.group()) print(obj.groups()) # ### 命名分组 """ 3) (?P<组名>正则表达式) 给这个组起一个名字 4) (?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置 """ # 写法一 strvar = " z3d4pzd a1b2cab " obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)\1\2",strvar) print(obj) print(obj.group()) # 写法二 strvar = " z3d4pzd a1b2cab " obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)(?P=tag1)(?P=tag2)",strvar) print(obj) print(obj.group())
2. 正则函数
# ### 正则函数 import re # search 通过正则匹配出第一个对象返回,通过group取出对象中的值 strvar = "3+4 6*4" obj = re.search(r"(\d+[+*]\d+)",strvar) print(obj) # 获取匹配http://www.cppcns.com到的内容 print(obj.group()) # 获取分组当中的内容 (返回元组) print(obj.groups()) # match 验证用户输入内容 (了解) """search在正则表达式的前面加上^ 等价于 match ,其他用法上一模一样""" strvar = "a17366668888" strvar = "17366668888" # obj = re.search(r"^\d+",strvar) # obj = re.match(r"\d+",strvar) # print(obj.group()) print(obj) # split 切割 strvar = "alex|wusir_xboyww@risky" lst = re.split("[|_@]",strvar) print(lst) strvar = "alex2341273894wusir234234xboyww11111risky" lst = re.split("\d+",strvar) print(lst) # sub 替换 strvar = "alex|wusir_xboyww@risky" """ strvar = strvar.replace("|","&") strvar = strvar.replace("_","&") strvar = strvar.replace("@","&") print(strvar) """ # sub(正则,替换的字符,原字符串[,替换的次数]) res = re.sub("[|_@]","&",strvar) res = re.sub("[|_@]","&",strvar,1) print(res) # subn 替换 (用法上与sub相同,只是返回值不同) res = re.subn("[|_@]","&",strvar) res = re.subn("[|_@]","&",strvar,2) print(res) # res = re.sub("[|_@]","&",strvar) # ('alex&wusir&xboyww@risky', 2) # finditer 匹配字符串中相应内容,返回迭代器 """返回的是迭代器,迭代器中包含了对象 对象.group来获取匹配到的值""" from collections import Iterator, Iterable strvar = "sdf23647fdgdfg()*()*23423423" it = re.finditer("\d+",strvar) print(isinstance(it,Iterator)) for obj in it: print(obj.group()) # compile 指定一个统一的匹配规则 """ 正常情况下,正则表达式编译一次,执行一次 为了避免反复编译,节省时间空间,可以使用compile统一规则 编译一次,终身受益 """ strvar = "asdfs234sdf234" pattern = re.compile("\d+") print("<===>") obj = pattern.search(strvar) print(obj.group()) lst = pattern.findall(strvar) print(lst) # 修饰符 # re.I 使匹配对大小写不敏感 strvar = "<h1>大标题</H1>" pattern = re.compile("<h1>(.*?)</h1>" , flags=re.I) obj = patter编程客栈n.search(strvar) print(obj.group()) # re.M 使每一行都能够单独匹配(多行匹配),影响 ^ 和 $ """单行独立匹配,而不是整体匹配""" strvar = """ <p>111&编程客栈lt;/p> <a>222</a> <strong>333</strong> """ pattern = re.compile("^<.*?>(?:.*?)<.*?>$" , flags=re.M) lst = pattern.findall(strvar) print(lst) # re.S 使 . 匹配包括换行在内的所有字符 strvar = """ give sdfsdfmefive """ # 多个修饰符一起使用通过|拼接 pattern = re.compile(".*?mefive" , flags = re.S|re.I|re.M ) obj = pattern.search(strvar) print(obj.group())
小提示:
爬虫爬数据的时候用finditer,数据太大,用迭代器存 strvar = """ <p>111</p> <a>222</a> <strong>333</strong> """ pattern = re.compile("^<.*?>(?:.*?)<.*?>$") lst = pattern.findall(strvar) print(lst) # 这里的结果为[] 因为.不匹配换行符,所以不会返回结果 pattern = re.compile("^<.*?>(?:.*?)<.*?>$",flags=re.M) 这里就是 一行的一行的匹配了 不会用for i in找思路 不会用.*?找思路
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
精彩评论