# re模块 # 对一个大篇幅的字符串指定按照一定的规则找出想要的字符串 import re s1 = "好好学习 天天向上" print(s1.find("天天")) # 5 print(re.findall("天天", s1)) # ['天天'] # \w 匹配字母中文数字下划线 # \W 匹配特殊字符 print(re.findall("\w", "太白 123 ABC-- *%")) # ['太', '白', '1', '2', '3', 'A', 'B', 'C'] print(re.findall("\w\w", "太白 123 ABC-- *%")) # ['太白', '12', 'AB'] # \s \S # \s 匹配任意的空白字符 # \S 匹配任意非空白字符 print(re.findall("\w", "太白 123\t\n")) # ['太', '白', '1', '2', '3'] print(re.findall("\W", "太白 123\t\n")) # [' ', '\t', '\n'] # \d 匹配数字 # \D 匹配非数字 print(re.findall("\d", "太白 123\t\n")) # ['1', '2', '3'] print(re.findall("\D", "太白 123\t\n")) # ['太', '白', ' ', '\t', '\n'] # \A ^ 两个都是匹配字符串的开始 print(re.findall("\A老", "老男孩 太白金星")) # ['老'] print(re.findall("\A老男孩", "老男孩 太白金星")) # ['老男孩'] print(re.findall("\A男孩", "老男孩 太白金星")) # [] print(re.findall("^男孩", "老男孩 太白金星")) # [] print(re.findall("^老男孩", "老男孩 太白金星")) # ['老男孩'] # \Z $ 匹配字符串的结束 print(re.findall("金星$", "老男孩 太白金星")) # ['金星'] print(re.findall("\$$", "老男孩 太白金星$")) # ['$'] print(re.findall("金星\Z", "老男孩 太白金星")) # ['金星'] # \n \t 匹配换行符 制表符 print(re.findall("\n", "\n dasd \n \n")) # ['\n', '\n', '\n'] print(re.findall("\t", "\t dasd \t\n \n")) # ['\t', '\t']
# 重复匹配 # . ? * + {m, n} .* .*? # . 这个点匹配任意字符 print(re.findall("a.b", "aabb")) # 首先确定是要匹配三个字符 # 然后是三个字符三个字符找 # ['aab'] print(re.findall("a.b", "babb")) # 先判断第一个字符是不是 a 开头,不是就跳到第二个判断,然后发现是 a 所以开始匹配 # ['abb'] print(re.findall("a.b", "abb a*b a1b a7b a+b a b a\nb a\tb")) # ['abb', 'a*b', 'a1b', 'a7b', 'a+b', 'a b', 'a\tb'] print(re.findall("a.b", "abb a*b a1b a7b a+b a b a\nb", re.DOTALL)) # ['abb', 'a*b', 'a1b', 'a7b', 'a+b', 'a b', 'a\nb'] # ? 匹配0个或1个由左边字符定义的片段 print(re.findall("a?b", "ab")) # ['ab'] # 这里涉及到贪婪匹配,虽然这里 b 前面有没有 a 都行,但是它就只匹配 ab ,不单独匹配 b print(re.findall("a?b", "abbzab abb aab")) # ['ab', 'b', 'ab', 'ab', 'b', 'ab'] # 注意上面提到的贪婪匹配 # * 匹配0个或多个左边字符表达式 print(re.findall("a*b", "b ab aaaaaab abbbbbb")) # ['b', 'ab', 'aaaaaab', 'ab', 'b', 'b', 'b', 'b', 'b'] # + 匹配1个或多个左边字符表达式(至少1个) print(re.findall("a+b", "b ab aaaaaab abb")) # ['ab', 'aaaaaab', 'ab'] # {m, n} 匹配m个至n个左边字符表达式 print(re.findall("a{1,3}b", "aaab ab aab abbb aaz aabb")) # 注意这里 {1,3} 中间不能由空格 # ['aaab', 'ab', 'aab', 'ab', 'aab']
# .* 贪婪匹配 从头到尾 print(re.findall("a.*b", "aab ab aaaaab a!!!%^&^%b")) # 注意这里的匹配过程是直接从开头的 a 到结尾的 b 匹配就行,中间不管是什么 # ['aab ab aaaaab a!!!%^&^%b'] print(re.findall("a.*b", "aab ab aaaaab a!!!%^&^%bz")) # 这里也是从开头的 a 匹配到倒数第二个字符 b, z 不匹配 # ['aab ab aaaaab a!!!%^&^%b'] # .*? 非贪婪匹配 从头到尾 print(re.findall("a.*?b", "aab ab aaaaab a!!!%^&^%b")) # 注意这里的 ? 是对前面 .* 的一个限定,而不是之前的 ? 的用法 # 这里跟贪婪的不一样, 它是一个一个来匹配看符不符合条件 # ['aab', 'ab', 'aaaaab', 'a!!!%^&^%b'] print(re.findall("a.*?b", "aab ab aaaaab a!!!%^&^%bz")) # ['aab', 'ab', 'aaaaab', 'a!!!%^&^%b']
# [] 代表一个范围内的任意一个字符 print(re.findall("a[abc]b", "aab abb acb")) # ['aab', 'abb', 'acb'] # 这里表示 a b 之间 只要有 abc 的任意一个字符都匹配 # 匹配数字 print(re.findall("a[0-9]b", "a1b a2b a3b acb ayb")) # ['a1b', 'a2b', 'a3b'] # 匹配小写字母 print(re.findall("a[a-z]b", "a1b a2b a3b acb ayb")) # ['acb', 'ayb'] # 匹配大写字母 print(re.findall("a[A-Z]b", "a1b a2b a3b aAb aBb acb ayb")) # ['aAb', 'aBb'] # 匹配大小写字母 print(re.findall("a[a-zA-Z]b", "a1b a2b a3b aAb aBb acb ayb")) # ['aAb', 'aBb', 'acb', 'ayb'] # 注意还是强调一点,一个[]代表一个字符 print(re.findall("a[0-9][0-9]", "a1b a9b a32b a788b"))
# print(re.findall("a[+-*%]", "a+b a-b a*b a%b a6b")) # 注意这里的 [+-*%] 会飘红,因为 - 放在中间 Python会认为是范围符号,所以应该改为: print(re.findall("a[-+*%]b", "a+b a-b a*b a%b a6b")) # 把 - 放最前面 # ['a+b', 'a-b', 'a*b', 'a%b'] # () 指定一个规则,将满足规则的结果匹配出来 print(re.findall(".*?_sb", "他是_sb 日本_sb 美国_sb")) # ['他是_sb', ' 日本_sb', ' 美国_sb'] print(re.findall("(.*?)_sb", "他是_sb 日本_sb 美国_sb")) # 注意这里空格也有加进去,上面那个一样 # ['他是', ' 日本', ' 美国'] # \ 匹配 print(re.findall("我|中|ask", "我 中 中国 ask asjda")) # ['我', '中', '中', 'ask'] # 注意下面两个的区别 print(re.findall('compan(y|ies)','companies have gone bankrupt, and my company')) # ['ies', 'y'] # print(re.findall('company|companies)','Too many companies have gone bankrupt, and the next one is my company')) # print(re.findall('compan(?:y|ies)','companies have gone bankrupt, and company')) # ['companies', 'company'] # search 找到第一个就返回 print(re.search("alex", "re alex alex")) # <_sre.SRE_Match object; span=(3, 7), match='alex'> print(re.search("alex", "re aex ex")) # None ret = re.search("alex", "re alex alex") print(ret.group()) # alex # search 总结 # 1.找到第一个就返回,返回的是一个对象,找不到就返回None # 2.使用 对象.group() 可以将找到的第一个值取出来
# match 匹配字符串的开始 print(re.search("barry", "barryalksjlk").group()) # barry print(re.match("barry", "barryalksjlk").group()) # barry # 如果没有匹配到,不能用.group(),否则会报错 # print(re.match("barry", "arryalksjlk").group()) # split s1 = "wusir;李白;alex; 日天" print(s1.split(";")) # ['wusir', '李白;alex', ' 日天'] print(s1.replace(";", ";").split(";")) # ['wusir', '李白', 'alex', ' 日天'] s2 = "wusir;李白,alex|日天!小虎" print(re.split("[;,|!]", s2)) # ['wusir', '李白', 'alex', '日天', '小虎']
# sub 替换 print(re.sub('barry', '太白', 'barry是最好的讲师,barry就是一个普通老师,请不要将barry当男神对待。')) # 太白是最好的讲师,太白就是一个普通老师,请不要将太白当男神对待。 print(re.sub('barry', '太白', 'barry是最好的讲师,barry就是一个普通老师,请不要将barry当男神对待。',2)) # 太白是最好的讲师,太白就是一个普通老师,请不要将barry当男神对待。 print(re.sub('([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)', r'\1\2\3\4\5', r'alex is sb')) # ^在中括号中是取反 # alex is sb print(re.sub('([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)', r'\5\2\3\4\1', r'alex is sb')) # sb is alex # compile obj = re.compile("\d{2}") print(obj.findall("fdsafsda1243fdsdf324")) # ['12', '43', '32']
# finditer ret = re.finditer("\d", "dsjk3ska342a") print(next(ret).group()) # 3 print(next(ret).group()) # 3 print(next(ret).group()) # 4 print(next(ret).group()) # 2 # print([i.group for i in ret]) s3 = '深圳电话:0755-546123546 深圳地址:广东..' ret = re.search("\d+-\d+", s3) print(ret.group()) # 0755-546123546 # 命名分组 ?P<组名> ret = re.search("(?P<quhao>\d+)-(?P<number>\d+)", s3) print(ret.group("quhao")) # 0755 print(ret.group("number")) # 546123546 # 取出 192.168.6.11 s4 = "ip='192.168.6.11', version:1.0.0" # 方法一 print(re.search("ip='\d+\.\d+\.\d+\.\d+'", s4).group()) # ip='192.168.6.11' # 方法二 ret = re.search("(?P<ip>\d+\.\d+\.\d+\.\d+)", s4) print(ret.group("ip")) # 192.168.6.11