zoukankan      html  css  js  c++  java
  • 复习正则表达式20190618

    python中的正则表达式大致分为以下几个部分:

    1、元字符

    2、模式

    3、函数

    4、re 内置对象用法

    5、分组用法

    6、环视用法

    Python处理正则表达式的模块是re模块

    一、元字符

        一般字符(匹配自身)

           匹配任意字符(不包括换行符),在DOTALL模式下可以匹配换行符

             转义一个特殊的字符,是这个字符表示原来字面上的意思。如\.匹配.

        预定义字符集

    [...]     匹配括号中出现的任意单个字符

    [^...]   不批括号中列出的单个字符(注意只能针对单个字符)

    d        匹配任意一个数字,范围为[0-9]

    D        匹配任意一个非数字,等价于[^0-9]

    s         匹配任意一个空白字符:[<空格> vf]

    S        匹配任意一个非空白字符,等价于[^s]

    w        匹配任意一个字母、数字、下划线

    W       不匹配任意一个字母、数字、下划线,等价于[^w]

        数量字符集

    ^        匹配开始位置,多行模式下匹配每一行的开始

    $        匹配结束位置,多行模式匹配每一行的结束

    *         匹配0次1次或多次

    +        匹配1次或多次

          匹配0到1次

    {m}     匹配前一个字符m次

    {m,n}  匹配前一个字符m到n次

    {m,}    匹配前一个字符最少m次

    {,n}     匹配前一个字符0到n次,最多n次

    A       仅匹配字符串的开始

            仅匹配字符串的结束,如果存在换行,只匹配到换行之前的前的结束字符

            匹配一个单词的边界,也就是单词和空格之间的每一行结尾

    B        [^]表示匹配非单词边界

    |(或)    |或匹配符,表达左右正则表达式任意匹配一个。如果左边的表达式匹配上了,匹配结束,不再                                                             

               匹配右便的表达式。改符号一般放在()中使用,如果没在()中使用则它的范围是整个表达式

    分组

    (...)      向后引用。用()括起来的正则表达式被作为一个分组,从正则表达式的左边一次算起,右多少         

                个‘(’,就有多少个分组,分组的编码从1 开始一次加1,无论是括号中嵌套括号,并且作为分    

               组表达式作为一个整体,后可接数量词

    <num>  引用分组匹配到的分组编号为<num>的字符串

    二、模式

        正则表达式的模式是可以同时使用多个的,python里面使用|同时添加多个模式

    re.I    忽略大小写匹配模式

    re.L   字符集本地化

    re.M   多行匹配

    re.S    此模式下.可以匹配任意字符,包括换行符

    re.U   根据Unicode字符集解析字符。这个标志影响:w W  B s S d D

    re.X   此模式忽略正则表达式中的空白和#号的注释,常用于匹配邮箱的正则表达式

    三、函数

     re.complie(pattren,flags=0)

      给定一个正则表达式pattern,制定使用模式flags默认是0,即不适用任何模式

    例子:

    import re

    pattern = re.compile(r"hello")

    rege = pattern.match("hello wordld!")

    print(rege)

    re.match(pattern,string,flags=0)

    开始位置匹配,匹配成功,则匹配到了,否则匹配失败

    re.search()

    任意位置开始匹配,第一次匹配成功了,就不会往下匹配了

    re.findall()

    匹配整个字符串,匹配成功返回一个列表,匹配失败返回一个空的列表

    re.finditer()

    与findall一样,不同之处在于findall是返回一个列表,finditer返回一个迭代器

    re.split(pattern,string,maxsplit=0,flags=0)

    参数maxsplit制定切割次数,函数使用正则表达式寻找字符串的位置,返回切割后的字符串列表,匹配不成功,则返回原字符串列表

    re.sub(pattern,repl,string,count=0,flags=0)

    替换函数,将正则表达pattern匹配到的字符换替换为repl制定的字符串,参数count指替换的最大次数

    练习题:

    s = 'sunck !  is a good man!'
    import re
    
    print(re.split(r" +",s))
    print(re.split(r"!",s))
    print(s.split())
    
    
    s1 = 'sunck is a good man!sunck is a nice man!sunck is a handsome man'
    d = re.finditer(r"sunck",s1)
    while 1:
        try:
            i =next(d)
            print(d)
        except StopIteration as e:
            break

    '''

    字符串的替换、修改

    sub(pattern.repl.string.count = 0,flags = 0)  返回一个被替换h后的字符串

    subn(pattern,repl,sting,count = 0.flage = 0)  返回一个元组,第一个被替换后的字符串,第二个是替换的次数

    '''

    s3 = 'sunck is a good good good man!'
    print(re.sub(r"good","nice",s3))
    
    print(re.subn(r"good","nice",s3))
    
    '''
    分组group()
    '''
    s4 = '010-63214569'
    m = re.match(r"(d{3})-(d{8})",s4)
    print(m.group())
    print(m.group(1))
    print(m.group(2))

    """

    写一个函数匹配字符串中的5个数字

    """

    import re
    def test_regular(destine_string):
        result = re.search(r"Dd{5}D|^d{5}D|d{5}$|^d{5}$",destine_string)
        if result:
            word_list=[]
            for s in result.group():
                if s in '0123456789':
                    word_list.append(s)
            print("".join(word_list))
            return "".join(word_list)
        else:
            print("NOT find")
            return "NOT find"
    
    if __name__=="__main__":
        test_data = ["12345","avcd12345","12345ww","abc12345qw"]
        for data in test_data:
            #assert test_regular(data) =="12345"
            #assert test_regular('12345')=="12345"
            #assert test_regular('x12345') == "12345"
            #assert test_regular('12345qq') == "12345"
            #assert test_regular('12345') == "12345"
            assert test_regular('vvv12345qq') == "12345"

    """

    提取字符串中所有的有效的域名地址

    """

    add = 'https://www.net.com.edu//action=?asdfsd and other '
    import re
    res = re.findall(r"((w{3}.)(w+.)+(com|edu|cn|net))",add1)
    print(res)
  • 相关阅读:
    javajava.lang.reflect.Array
    基于annotation的spring注入
    jquery插件
    spring的注入方式
    jqueryajax
    javascript基础
    xml基础
    js 获取FCKeditor 值
    TSQL 解析xml
    Linq
  • 原文地址:https://www.cnblogs.com/ff-gaofeng/p/11045492.html
Copyright © 2011-2022 走看看