美文网首页
正则表达式

正则表达式

作者: kris_lp | 来源:发表于2018-04-09 18:54 被阅读0次

    在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
    很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。
    推荐学习30分钟入门教程(ps:当然你可能不止花费30分钟-):http://deerchao.net/tutorials/regex/regex.htm
    Python堆正则表达式的支持:

    compile

    compile(pattern, flags=0)
    编译正则表达式返回正则表达式对象

    match

    match(pattern, string, flags=0)
    用正则表达式匹配字符串,匹配成功返回匹配对象,否则返回None。从第一个字符开始匹配。

    search

    search(pattern, string, flags=0)
    搜索字符串中第一次出现正则表达式的模式,匹配成功返回匹配对象,否则返回None,可以从任意位置开始匹配。

    findall 和 finditer

    findall(pattern, string, flags=0)
    查找字符串所有与正则表达式匹配的模式,并返回一个列表。
    finditer(pattern, string, flags=0)
    查找字符串所有与正则表达式匹配的模式,并且返回一个迭代器。span返回匹配的位置,group返回匹配的内容。
    下面这个实例是查找出字符串中所有的电话号码,用findall 和 finditer 两种方式查找

    import re
    
    
    def phone_num():
        patter1 = re.compile(r'(?<=\D)1[345789]\d{9}(?=\D)')
        sentence = '重要的事情说8130087690870遍,我的手机号是13567672929,不是13789890976!'
        # 找出所有匹配的内容 返回一个列表
        my_list = patter1.findall(sentence)
        print(my_list)
        # iter - iterator 迭代器
        for temp in patter1.finditer(sentence):
            print(temp)
            print(temp.span())
            print(temp.group())
    
    if __name__ == '__main__':
        phone_num()
    

    sub

    sub(pattern, repl, string, count=0, flags=0)
    用指定的字符串替换原字符串中与正则表达式匹配的模式,
    patter需要替换的字符,repl用作替换的内容,string指定的字符串,count指定替换的次数,flags设置是否忽略大小写。

    import re
    
    
    def main():
        sentence = '马化腾傻逼操你大爷fuck你'
        # 内容替换
        # 正则表达式 替换符 替换的内容 是否忽略大小写
        pure = re.sub('[操草艹]|傻逼|fuck|马化腾', '*', sentence, flags=re.IGNORECASE)
        print(pure)
    
    if __name__ == '__main__':
        main()
    

    注意:替换符可以是字符/字符串/可调用的函数,下面这个例子的替换内容就是一个函数。

    from re import sub
    
    
    def foo(mo):
        # mo - 匹配对象
        # group返回匹配的对象,传入参数foo1,这是一个组名,返回此组的匹配的内容
        # mo.group('foo1') - 返回名称为foo1组里的文本
        value = int(mo.group('foo1'))
        return str(value ** 2)
    
    
    def main():
        sentence = 'fgkfshf12hdjsh876hdf962hf'
        # (?P<foo1>\d+) 匹配一个或多个数字,并捕获文本到名称为foo1的组里
        # 注意:Python中必须加上P
        print(sub(r'(?P<foo1>\d+)', foo, sentence))
    
    
    if __name__ == '__main__':
        main()
    

    运行结果:字符串中所有的数字都被替换成了其平方

    fgkfshf144hdjsh767376hdf925444hf
    

    split

    split(pattern, string, maxsplit=0, flags=0)
    patter拆分依据,string指定的字符串,flags设置是否忽略大小写。

    def main():
        sentence1 = 'you go your way, i will go home!'
        # 按照空白符字符拆分
        mylist = re.split(r'[ ,!]', sentence1)
        print(mylist)
    
    
    if __name__ == '__main__':
        main()
    

    相关文章

      网友评论

          本文标题:正则表达式

          本文链接:https://www.haomeiwen.com/subject/fkiihftx.html