• re模块——正则表达式


    # 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("ww", "太白 123 ABC-- *%"))
    # ['太白', '12', 'AB']
    
    # s S
    # s 匹配任意的空白字符
    # S 匹配任意非空白字符
    print(re.findall("w", "太白 123	
    "))
    # ['太', '白', '1', '2', '3']
    print(re.findall("W", "太白 123	
    "))
    # [' ', '	', '
    ']
    
    # d 匹配数字
    # D 匹配非数字
    print(re.findall("d", "太白 123	
    "))
    # ['1', '2', '3']
    print(re.findall("D", "太白 123	
    "))
    # ['太', '白', ' ', '	', '
    ']
    
    # A ^ 两个都是匹配字符串的开始
    print(re.findall("A老", "老男孩 太白金星"))
    # ['老']
    print(re.findall("A老男孩", "老男孩 太白金星"))
    # ['老男孩']
    print(re.findall("A男孩", "老男孩 太白金星"))
    # []
    print(re.findall("^男孩", "老男孩 太白金星"))
    # []
    print(re.findall("^老男孩", "老男孩 太白金星"))
    # ['老男孩']
    
    #  $ 匹配字符串的结束
    print(re.findall("金星$", "老男孩 太白金星"))
    # ['金星']
    print(re.findall("$$", "老男孩 太白金星$"))
    # ['$']
    print(re.findall("金星", "老男孩 太白金星"))
    # ['金星']
    
    # 
     	 匹配换行符 制表符
    print(re.findall("
    ", "
     dasd 
     
    "))
    # ['
    ', '
    ', '
    ']
    print(re.findall("	", "	 dasd  	
     
    "))
    # ['	', '	']
    # 重复匹配
    # . ? * + {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
    b a	b"))
    # ['abb', 'a*b', 'a1b', 'a7b', 'a+b', 'a b', 'a	b']
    print(re.findall("a.b", "abb a*b a1b a7b a+b a b a
    b", re.DOTALL))
    # ['abb', 'a*b', 'a1b', 'a7b', 'a+b', 'a b', 'a
    b']
    
    # ? 匹配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'12345', 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'52341', 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
  • 相关阅读:
    Mirco2440核心板设计思考
    linux 第一次获得root权限
    MakeFile 文件详解
    windows下编辑过的文件在Linux下用vi打开行尾会多出一个^M符号
    linux信息查找
    ubuntu不能正常使用make menuconfig的解决方案
    Linux 解压/压缩操作命令
    Linux 文件/文件夹操作命令
    Linux内核开发基础
    计算文件夹的大小
  • 原文地址:https://www.cnblogs.com/shawnhuang/p/10255067.html
Copyright © 2020-2023  润新知