美文网首页
python基础模块---re

python基础模块---re

作者: 堪怜咏絮才 | 来源:发表于2020-03-31 16:02 被阅读0次
    import re
    
    '''
    .   匹配任意字符
    []  匹配[]出现的内容
    [^...]  匹配不在[]出现的内容
    \d  匹配数字
    \D  匹配非数字
    \s  匹配空白
    \S  匹配非空白
    \w  匹配字母,数字,下划线,汉字
    \W  匹配非字母,非数字,非下划线,非汉字
    ^   匹配行首
    $   匹配行尾
    \A  匹配字符串的开头
    \z  匹配字符串的结尾
    \Z  字符串结束,有换行,则换行前结束
    \b  匹配单词边界
    \B  匹配非单词边界
    \G  最后匹配完成的位置
    a|b 匹配a或b
    {n} 匹配n次
    {n,}    匹配大于等于n次
    {n, m}  匹配n到m次,包括n和m
    *   匹配0次或多次
    +   匹配1次或多次
    ?   匹配0次或一次
    *?  匹配0次或多次,越少越少
    +?  匹配1次或多次,越少越好
    ??  匹配0次或1次,越少越好
    [0-9]   匹配0-9中的任意一个数字
    [a-z]   匹配a-z中的任意一个字母
    [A-Z]   匹配A-Z中的任意一个字母
    
    备注:对于Python来说,默认是贪婪匹配,一个正则表达式做最大程度的匹配
    '''
    
    '''
    re.match(pattern, string, flags=0)
        尝试从字符串的开始位置来匹配正则表达式,如果从开始位置匹配不成功,match() 函数就返回 None 。其中 pattern 参数代表正则表达式;
        string 代表被匹配的字符串;flags 则代表正则表达式的匹配旗标。该函数返回 _sre.SRE_Match 对象,该对象包含的 span(n) 
        方法用于获取第 n+1 个组的匹配位置,group(n) 方法用于获取第 n+1 个组所匹配的子串。
        match方法可以指定匹配的开始下标和结束下标
    '''
    test_str = 'hfhewkfsklsgjgegje'
    pattern = re.compile('hfhe')
    pattern1 = re.compile('fskl')
    result = pattern.match(test_str)
    print(pattern1.match(test_str, 6))
    print(pattern1.match(test_str, 6, 10))
    print(result.span())        # 获取匹配下标范围
    print(result.group())       # 获取匹配结果
    print(result.start())       # 获取匹配起始下标
    print(result.end())         # 获取匹配结束下标
    print(result.string)        # 获取被匹配的字符串
    
    
    '''
    re.search(pattern, string, flags=0)
        扫描整个字符串,并返回字符串中第一处匹配 pattern 的匹配对象。其中 pattern 参数代表正则表达式;string 代表被匹配的字符串;
        flags 则代表正则表达式的匹配旗标。该函数也返回 _sre.SRE_Match 对象。
    
    match() 与 search() 的区别在于,match() 必须从字符串开始处就匹配,但 search() 可以搜索整个字符串
    '''
    test_str = 'hfhewkfsklsgjgegje'
    pattern = re.compile('fskl')
    result1 = pattern.search(test_str)
    print(result1.group())
    
    
    '''
    re.findall(pattern, string, flags=0)
        扫描整个字符串,并返回字符串中所有匹配 pattern 的子串组成的列表。其中 pattern 参数代表正则表达式;string 代表被匹配的宇符串;
        flags 则代表正则表达式的匹配旗标。
    '''
    test_str = 'abcddfjsabcdfhewhfabcd'
    pattern = re.compile('abcd')
    result2 = pattern.findall(test_str)
    print(result2)      # ['abcd', 'abcd', 'abcd']
    
    '''
    re.finditer(pattern, string, flags=0)
        扫描整个字符串,并返回字符串中所有匹配 pattern 的子串组成的迭代器,迭代器的元素是 _sre.SRE_Match 对象。
        其中 pattern 参数代表正则表达式;string 代表被匹配的字符串;flags 则代表正则表达式的匹配旗标。
    '''
    test_str = 'abcddfjsabcdfhewhfabcd'
    pattern = re.compile('abcd')
    result2 = pattern.finditer(test_str)
    for i in result2:
        print(i.group())
        print(i.span())
    # abcd
    # (0, 4)
    # abcd
    # (8, 12)
    # abcd
    # (18, 22)
    
    '''
    re.fullmatch(pattem, string, flags=0)
        该函数要求整个字符串能匹配 pattern,如果匹配则返回包含匹配信息的 _sre.SRE_Match 对象;否则返回 None。
        fullmatch可以指定匹配的开始下标和结束下标
    '''
    test_str = 'hfsehfe'
    pattern = re.compile('hfsehfe')
    result = pattern.fullmatch(test_str)
    print(result.group())   # hfsehfe
    print(result.span())    # (0, 7)
    
    
    '''
    re.sub(pattern, repl, string, count=0, flags=0)
        该函数用于将 string 字符串中所有匹配 pattern 的内容替换成 repl;repl 既可是被替换的字符串,也可是一个函数。
        count 参数控制最多替换多少次,如果指定 count 为 0 ,则表示全部首换。默认为为0
    '''
    test_str = '2020-3-31'
    patter = re.compile('-')
    print(patter.sub('/', test_str))        # 2020/3/31
    
    '''
    re.split(pattem, string, maxsplit=0, flags=0)
        使用 pattern 对 string 进行分割,该函数返回分割得到的多个子串组成的列表。其中 maxsplit 参数控制最多分割几次。
        默认为0,表示全部分割
    '''
    
    test_str = '20,20-3-31'
    pattern = re.compile('-|,')
    print(pattern.split(test_str))
    
    
    def fun(matched):
        # matched就是匹配对象,通过该对象的group()方法可获取被匹配的字符串
        value = "《基础" + (matched.group('lang')) + "教程》"
        return value
    
    
    s = 'Python很好,Kotlin也很好'
    # 将s里面的英文单词(用re.A旗标控制)进行替换
    # 使用fun函数指定替换的内容
    print(re.sub(r'(?P<lang>\w+)', fun, s, flags=re.A))       # 命名捕获组
    
    '''
    re.purge():清除正则表达式缓存。
    '''
    '''
    re.escape()
        对模式中除 ASCII 字符、数值、下画线(_)之外的其他字符进行转义
        该方法有利于我们写正则表达式
    '''
    test_str = 'http://python.org'
    tran_pattern = re.escape(test_str)  # http://python\.org
    pattern = re.compile(tran_pattern)
    print(pattern.fullmatch(test_str))
    
    '''
    捕获组
        在正则中使用(),就表示使用了捕获组
    命名捕获组
        (?P<name>pattern)
    '''
    test_str ='python java golang php ruby erlang'
    pattern = re.compile('(python).*?(golang).*?')
    result = pattern.search(test_str)
    print(result)       #<re.Match object; span=(0, 18), match='python java golang'>
    print(result.group())       # 获取所有的内容 python java golang
    print(result.group(0))      # 获取所有的内容 python java golang
    print(result.group(1))      # 获取编号为1号的捕获组的内容 python
    print(result.group(2))      # 获取编号为2号的捕获组的内容 golang
    print(result.groups())      # 获取所有的捕获组的内容   ('python', 'golang')
    
    test_str = 'http://python.org is a domain'
    pattern = re.compile('(?P<prefix>python).*?(?P<suffix>org).*?')
    result = pattern.search(test_str)
    print(result.group())       # python.org
    print(result.groups())      # ('python', 'org')
    print(result.groupdict())   # {'prefix': 'python', 'suffix': 'org'}
    
    '''
    正则表达式的标志位:
        正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定
        re.I   忽略大小写
        re.M   多行匹配,影响^和$
        re.S   使.能够匹配包括换行符在内的所有内容
        re.X   忽略空格和 # 后面的注释
        re.U   Unicode解码,影响 \w, \W, \b, \B, \d, \D, \s, \S    如果设置了此re.UNICODE标志,就会影响到\w,\W,\b,\B,\d,\D,\s,\S的含义。
        re.L   本地化识别匹配,影响 \w, \W, \b, \B, \d, \D, \s, \S  如果添加了re.LOCALE这个标志,则:\w,\W,\b,\B,\s,\S的含义,和具体的locale相关。
    '''
    test_str = 'PYTHON is good!'
    pattern = re.compile('python is good!', re.I)
    print(pattern.fullmatch(test_str))      # <re.Match object; span=(0, 15), match='PYTHON is good!'>
    
    
    test_str = '''Million nothing green human.
                    Mission finally discover other social cut
                    century. Provide argue political study while improve view.'''
    pattern1 = re.compile('.*?(human).*?(study).*?', re.S)
    print(pattern1.fullmatch(test_str))
    
    
    test_str = 'python\ngo\njava'
    pattern = re.compile('^\w+')
    pattern1 = re.compile('^\w+', re.M)
    print(pattern.findall(test_str))        # ['python']
    print(pattern1.findall(test_str))       # ['python', 'go', 'java']
    
    
    '''
    零宽断言:用于查找特定内容之前或之后的内容,但并不包括特定内容本身。
    对于零宽断言来说,最重要的一个概念是位置,零宽断言用于指定一个位置,这个位置应该满足一定的条件(它附近满足什么表达式),
    并且这个位置不是字符(因此匹配返回无结果),仅仅是一个位置,因此它们也被称为零宽断言
    零宽断言重点的这一个位置,是通过一个条件:这个位置附近(前或者后)存在或者不存在一个A(A可以是一个表达式)来决定的
        (?=exp) :此位置后面匹配表达式exp      正向前视断言
        (?!exp):此位置后面不匹配表达式exp     负向前视断言
        (?<=exp):此位置前面匹配表达式exp      正向后视断言   
        (?<!exp):此位置前面不匹配表达式exp    负向后视断言
        
    正向,负向表示匹配不匹配的关系
    前视,后视指定了是表示之前,还是表达式之后,前视表示表达式后面的位置,后视表示表达式前面的位置。将正则匹配
    看做是对字段字符串的扫描,已经扫描的表示后面,所以称为后视,还没扫描的看做前面,所以叫做前视
    '''
    str = '<div>hello world</div>'
    print(re.search('(?=he).*', str).group())       # hello world</div>
    print(re.search('(?!he).*(?<=ld)', str).group())        # <div>hello world
    
    

    相关文章

      网友评论

          本文标题:python基础模块---re

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