Python3 正则表达式

发布时间:2019-05-17 21:44:00编辑:auto阅读(1996)

    1.导入正则表达式模块

    import re

    2.匹配数字

    print(re.findall('[0-9]','qwe21ewq'))

    输出结果:

    3.匹配字符

    print(re.findall('[a-zA-Z]','abC'))

    输出结果:

    匹配-,只需要令-挨着[就可以,不需要进行转义.如果-没有挨着[才需要进行转义

    print(re.findall('[-0-9]','qw-e21ewq'))

    输出结果:

    排除字符

    print(re.findall('[^0-9]','qw-e21ewq'))

    输出结果:

    如果想要匹配’^’,只需要’^’不挨着'[‘就行,如果挨着'[‘,就需要进行转义

    4.概括字符集

    \d=[0-9]    digit
    \w=[0-9a-zA-Z]    word还可以匹配下划线
    \s=[\t\r\n\v\f]    space 制表符,回车符,换行符
    \D,\W,\S分别与\d,\w,\s相反
    .可以匹配任意字符除了换行符\n

    5.数量词

    print(re.findall(r'\d{3,5}','qw-e21231ewq'))

    输出结果:

    数量词用法

    \d{6}    出现6次数字
    \d{4,6}    数字出现4-6次
    \d{4,}    数字出现4-65536次
    \d{0,6}    数字出现0-6次
    *={0,}
    +={1,}
    ?={0,1}

    数量词默认用法是贪婪,如果在数量词后面加’?’,进行非贪婪

    print(re.findall(r'\d{3,5}?','qw-e21231ewq'))

    输出结果:

    6.定界符

    print(re.findall(r'^\d{5}$','qw-e21231ewq'))

    结果就是匹配不到,因为’^’代表从起始位置开始,’$’代表到末尾为止,所以这个字符串不能匹配

    \A也代表从起始位置开始,\Z代表到结束位置开始,与$不同的是,\Z在匹配多行字符串时,只匹配整个字符串的结束位置,而不匹配中间的字符串的结束位置.

    7.re.match和re.search

    re.match(pattern,string[,flags] )和re.search(pattern,string[,flags])的区别是:

    match是默认从字符串的起始位置开始的,而search就没有这个限制

    print(re.match('\d{3}','a123'))
    print(re.search('\d{3}','a123'))

    输出结果:

    8.group分组

    print(re.search('(\d{3})a(\w)','a123abc').group())
    print(re.search('(\d{3})a(\w)','a123abc').group(1))
    print(re.search('(\d{3})a(\w)','a123abc').group(2))

    输出结果:

    9.re.findall

    re.findall(pattern,string[,flags])以列表的形式返回所有符合条件的元素

    print(re.findall('\d{5}','a21231casd12345'))

    输出结果:

    10.re.sub

    字符串替换

    re.sub(pattern,replacement,string)

    print(re.sub('\d{5}','*','abc126322defg'))

    输出结果:

    第二个参数位置也可以传入一个函数,用来替换成更复杂的字符

    def rpl(value):
    	rp=value.group()
    	if int(rp)<5:
    		return ''
    	else:
    		return '!'
    
    print(re.sub(r'\d{5}',rpl,'abc126322defg'))

    输出结果:

    11.括号的作用

    (1)分组

    print(re.findall('(ab)+','aab'))

    输出结果:

    如果不加括号的话,就是要求’b’出现1次以上,而不是’ab’

    (2)多选结构

    print(re.findall('(\d{3}|[a-z]{3})','123abc'))

    输出结果:

    (3)引用分组

    <1>引用分组
    print(re.search('(\d{3})a(\w)','a123abc').group())
    print(re.search('(\d{3})a(\w)','a123abc').group(1))
    print(re.search('(\d{3})a(\w)','a123abc').group(2))

    输出结果:

    此图像的alt属性为空;文件名为image-111.png

    <2>反向引用

    匹配重复的字母

    print(re.findall(r'^([a-z])\1$','dd'))

    输出结果:

    \1代表重复前面的分组1

    <3>命名分组
    print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group())
    print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group('year'))
    print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group('month'))
    print(re.search(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})','2000-01-02').group('day'))

    输出结果:

    <4>非捕获分组
    print(re.search('(?:\d{3})a(\w)','a123abc').group())
    print(re.search('(?:\d{3})a(\w)','a123abc').group(1))

    输出结果:

    非捕获分组?:不影响匹配,但是非捕获分组不算组数

    12.转义

    如果是转义[a-z]或者{3},只需要\[a-z]和\{3}即可

    但是如果遇到了'(‘,’)’,’|’,(两个括号一个竖线)这三个字符,需要在它们前面加上转义符

    13.断言

    (1)单词边界

    单词边界\b,非单词边界\B

    print(re.findall(r'\b\w+\b','I love Python!'))

    输出结果:

    (2)环视

    (?!)  (?<!)  (?=)  (?<=)

    否定环视: (?!)和(?=)

    肯定环视: (?<!)和(?<=)

    环视的使用

    例如 (?!/) 就代表匹配的字符串右边不能出现’/’

    (?<!/)  就代表左边不能出现’/’

    肯定环视就是指如果匹配成功,在当前位置匹配成功

    否定就是指匹配成功,在当前位置匹配失败

    环视的最大特点就是匹配完成之后,还会停留在原地

    print(re.sub(r'(?<![a-zA-Z])\s+(?![a-zA-Z])','','I love Python! 我爱 '))

    输出结果:

    使用环视去掉了中英文混编时多余的空格,上面环视的意思就是匹配从某一个空白位置向左看不能出现字母,向右看也不能出现字母

    14.匹配模式

    1.不区分大小写
    (?i)the
    2.单行模式
    (?s)  这种模式下.也可以匹配\n
    3.多行模式
    (?m)
    4.注释模式
    (?x)
    print(re.findall(r'a','AbC',re.I))

    输出结果:

    15.面向对象式

    使用函数re.compile()

    使用方法:

    digitRegex=re.compile(r"\d+")
    
    digitRegex.findall('12 3')或
    re.findall(digitRegex,"12 3")

    compile还可以查看详细信息

    print(re.findall(r'a','AbC',re.I))

    输出结果:

关键字

上一篇: python学习_1

下一篇: Python3 标准库:calendar