Python-正则表达式-re模块

 
 
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式
result.group(1),获得分组1的内容
result.groups(),获得匹配的全部内容
re.search  扫描整个字符串并返回第一个成功的匹配

可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式
re.findall findall函数返回的总是正则表达式在字符串中所有匹配结果的列表

很灵活,难度也大,特别是有了分组之后,见附件文章。
(?: re) 类似 (...), 但是不表示一个组,很有意思

 
 
 
# -*- coding: utf-8 -*-
__author__ = 'duohappy'


import re


if __name__ == '__main__':

    # ^ start,匹配一个位置,字符串的开头
    # $ end,匹配一个位置,字符串的结尾
    # . except \n --->除了换行符之外的字符

    text = 'c++ p python2 python3 perl ruby p我们 lua java javascript php4 php5 c cc'

    #字符串开头位置后面有c,后面还跟上两个字符,字符不为换行符
    print(re.findall(r'^c..', text))  # 加上 ^ ,排除了 cri

    #在字符串开头位置后面有p,后面还跟3个字符,字符不为换行符
    print(re.findall(r'^p...', text))  # 字符串的开头位置!,所以这条语句没有把perl匹配出来

    print(re.findall(r'^c', text))

    # 同理,字符串结尾的位置前面有一个c
    print(re.findall(r'c$', text))

    #\b word boundary,单词分界位置,而不是字符串的开头位置!
    # \B ,not \b
    print(re.findall(r'\bc\w+\b', text))

    # + 1-inf ,限定前一个字符的出现的次数
    # * 0-inf
    # ? 0-1

    # 匹配出现一次或者多次c
    print(re.findall(r'c+', text))
    # \+ 表示一个+字符,后面+,表示+字符出现一次或者多次
    print(re.findall(r'c\++', text))

    #[] or,可选的范围
    # p开头,后面跟1个或者多个字母
    print(re.findall(r'p[a-zA-Z]+', text))

    # p开头,后面跟0个或多个字母
    print(re.findall(r'p[a-zA-Z]*', text))  # 所以会比上面多匹配一个

    # p开头,后面跟0个或1个字母
    print(re.findall(r'p[a-zA-Z]?', text))

    #{} repeat,前一个字符出现的次数
    #以p开头,后面跟4个或多个字母
    print(re.findall(r'p[a-zA-Z]{4,}', text))

    # ^,not 非
    #c开头,后面接一个或多个非字母
    print(re.findall(r'c[^a-zA-Z]+', text))

    # |,or
    print(re.findall(r'[pj][a-zA-Z]+', text))
    print(re.findall(r'p[a-zA-Z]+|j[a-zA-Z]+', text))  # 与上面的效果等同

    # \w [a-zA-Z0-9_汉字]
    print(re.findall(r'p\w+', text))

    # \d [0-9],\D [^0-9]
    print(re.findall(r'p\w+\d', text))

    #\s [ \t\n\r\f\v],匹配任意空白字符
    #\S,同\D
    print(re.findall(r'p\w+\s', text))

    # *? 懒惰模式,匹配的字符越少越好
    # +? 懒惰模式
    # 贪婪模式,匹配的字符越多越好
    print(re.findall(r'p[a-z]*', text))
    print(re.findall(r'p[a-z]*?', text))
    print(re.findall(r'p[a-z]+?\b', text))

    #分组
    #我们已经提到了怎么重复单个字符(直接在字符后面加上限定符就行了)如 p{4,}
    #但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组)(p\w+\b){3,},前面()即为分组
    print(re.findall(r'(p[a-zA-Z]+)(\d)', 'python3 php5'))
    #在'python3 php5'这个字符串中,找(p[a-zA-Z]+),(\d)
    a = re.search(r'(p[a-zA-Z]+)(\d)', 'python3 php5')
    print(a.group(0))

    #compile
    #先编译一个匹配项
    pattern = re.compile(r'\bp\w+')
    print(pattern.findall(text))

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2020-08-22 09:24  duohappy  阅读(193)  评论(0编辑  收藏  举报