zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    WRF WPS预处理
    CVS安装
    Linux窗口最小化消失,任务栏上无法找到的解决方法
    NCARG安装配置出现error while loading shared libraries: libg2c.so.0问题额解决办法
    Netcdf安装
    Embedding R-generated Interactive HTML pages in MS PowerPoint(转)
    The leaflet package for online mapping in R(转)
    Some 3D Graphics (rgl) for Classification with Splines and Logistic Regression (from The Elements of Statistical Learning)(转)
    What does a Bayes factor feel like?(转)
    Weka算法介绍
  • 原文地址:https://www.cnblogs.com/shawnhuang/p/10255067.html
Copyright © 2011-2022 走看看