python编程07 -- 正则表达式

简介

本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程。

参考地址

正则表达式运用

基础函数运用

#pattern类工厂方法

import re
pattern = re.compile(r'\d+') #将正则表达编译成pattern对象
print(pattern.split('one1two2three'))
#以此分隔并返回分开后的形式
print(pattern.match('0one1two2three'))
#返回一个对象
print(pattern.findall('one111two211three'))
#返回所有能匹配的对象
print(pattern.finditer('one1two2three'))
#返回为迭代器
pattern1 = re.compile(r'(\d\w+) (\d\w+)')
#相互交换位置
print(pattern1.sub(r'\2 \1','1one 2two'))

re.compile(strPattern[, flag])

  • 这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。

  • 第二个参数flag是匹配模式,取值可以使用按位或运算符’|’表示同时生效,比如re.I | re.M。

  • 可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)re.compile('(?im)pattern')是等价的。

  • 可选值:

    re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)

    M(MULTILINE): 多行模式,改变’^’和’$’的行为(参见上图)

    S(DOTALL): 点任意匹配模式,改变’.’的行为

    L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定

    U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性

    X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的:

    a = re.compile(r"""\d +  # the integral part
    \. # the decimal point
    \d * # some fractional digits""", re.X)
    b = re.compile(r"\d+\.\d*")
  • re提供了众多模块方法用于完成正则表达式的功能。

    这些方法可以使用Pattern实例的相应方法替代,唯一的好处是少写一行re.compile()代码,但同时也无法复用编译后的Pattern对象。这些方法将在Pattern类的实例方法部分一起介绍。如上面这个例子可以简写为:

    m = re.match(r'hello', 'hello world!')
    print m.group()
  • re模块还提供了一个方法escape(string)

    用于将string中的正则表达式元字符如*/+/?等之前加上转义符再返回,在需要大量匹配元字符时有那么一点用。

正则表达式

邮箱等规则字符串可用

  • 模糊查询:判断主题是字符串

  • 特殊字符:

    \d:数字(一个数字(开始为数字则正确))
    \D:非数字
    \w:单词字符
    \W:非单词字符
    \s:空白字符
    [1-9]: 1到9数字
    [a-z|A-Z]:所有英文字符

    转义符:\
    \\d:\d
    \.:.
    .:任意字符
    |:左右满足任何一个即可

  • 正则表达式的数量:

    *:0个或多个

    +:1个或多个

    ?:0个或1个 贪婪模式下:取消贪婪模式

    注意:+ ?`` * 匹配的是前一个字符

    贪婪模式:*? +? ?? {1,4}?

    ^:以xxx开头

    $:以XXX结尾

    \A:相当于:^\w

    \Z:相当于:\w$

    {0,5}:格式重复次数0到5次

    r:转译符,r’ ‘

re函数

match:尽量不匹配,找到一个马上返回
search
findall:尽量匹配

Match

Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。

  • 属性

    参数意义
    string匹配时使用的文本。
    re匹配时使用的Pattern对象。
    pos文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
    endpos文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
    lastindex最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。
    lastgroup最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。
  • 方法

    group([group1, …]):

    获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。

    group1可以使用编号也可以使用别名;

    编号0代表整个匹配的子串;不填写参数时,返回group(0);

    没有截获字符串的组返回None;

    截获了多次的组返回最后一次截获的子串。

    groups([default]):

    以元组形式返回全部分组截获的字符串。

    相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。

    groupdict([default]):

    返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。

    start([group]):

    返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。group默认值为0。

    end([group]):

    返回指定的组截获的子串在string中的结束索引(子串最后一个字符的索引+1)。group默认值为0。

    span([group]):

    返回(start(group), end(group))。

    expand(template):

    将匹配到的分组代入template中然后返回。

    template中可以使用\id或\g 、\g 引用分组,但不能使用编号0。

    \id与\g 是等价的;但\10将被认为是第10个分组,如果你想表达\1之后是字符’0’,只能使用\g<1>0。

    import re
    m = re.match(r'(\w+) (\w+)(?P<sign>.*)', 'hello world!')

    print "m.string:", m.string
    print "m.re:", m.re
    print "m.pos:", m.pos
    print "m.endpos:", m.endpos
    print "m.lastindex:", m.lastindex
    print "m.lastgroup:", m.lastgroup

    print "m.group(1,2):", m.group(1, 2)
    print "m.groups():", m.groups()
    print "m.groupdict():", m.groupdict()
    print "m.start(2):", m.start(2)
    print "m.end(2):", m.end(2)
    print "m.span(2):", m.span(2)
    print r"m.expand(r'\2 \1\3'):", m.expand(r'\2 \1\3')

    ### output ###
    # m.string: hello world!
    # m.re: <_sre.SRE_Pattern object at 0x016E1A38>
    # m.pos: 0
    # m.endpos: 12
    # m.lastindex: 3
    # m.lastgroup: sign
    # m.group(1,2): ('hello', 'world')
    # m.groups(): ('hello', 'world', '!')
    # m.groupdict(): {'sign': '!'}
    # m.start(2): 6
    # m.end(2): 11
    # m.span(2): (6, 11)
    # m.expand(r'\2 \1\3'): world hello!

Pattern

Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本
进行匹配查找。

Pattern不能直接实例化,必须使用re.compile()进行构造。
  • Pattern提供了几个可读属性用于获取表达式的相关信息

    pattern: 编译时用的表达式字符串。

    flags: 编译时用的匹配模式。数字形式。

    groups: 表达式中分组的数量。

    groupindex: 以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。

    import re
    p = re.compile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)

    print "p.pattern:", p.pattern
    print "p.flags:", p.flags
    print "p.groups:", p.groups
    print "p.groupindex:", p.groupindex

    ### output ###
    # p.pattern: (\w+) (\w+)(?P<sign>.*)
    # p.flags: 16
    # p.groups: 3
    # p.groupindex: {'sign': 3}

实例方法[ | re模块方法]:

  • match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])

    这个方法将从string的pos下标处起尝试匹配pattern;

    如果pattern结束时仍可匹配,则返回一个Match对象;

    如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None。

    pos和endpos的默认值分别为0和len(string);

    re.match()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。

    注意:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,
    仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'。
  • search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])

    这个方法用于查找字符串中可以匹配成功的子串。

    从string的pos下标处起尝试匹配pattern,如果pattern结束时仍可匹配,则返回一个Match对象;

    若无法匹配,则将pos加1后重新尝试匹配;直到pos=endpos时仍无法匹配则返回None。

    pos和endpos的默认值分别为0和len(string));re.search()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。

    # encoding: UTF-8 
    import re

    # 将正则表达式编译成Pattern对象
    pattern = re.compile(r'world')

    # 使用search()查找匹配的子串,不存在能匹配的子串时将返回None
    # 这个例子中使用match()无法成功匹配
    match = pattern.search('hello world!')

    if match:
    # 使用Match获得分组信息
    print match.group()

    ### 输出 ###
    # world
  • split(string[, maxsplit]) | re.split(pattern, string[, maxsplit])

    按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。

    import re
    
    p = re.compile(r'\d+')
    print p.split('one1two2three3four4')
    
    ### output ###
    # ['one', 'two', 'three', 'four', '']
  • findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])

    搜索string,以列表形式返回全部能匹配的子串。

    import re
    
    p = re.compile(r'\d+')
    print p.findall('one1two2three3four4')
    
    ### output ###
    # ['1', '2', '3', '4']
  • finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags])

    搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。

    import re
    
    p = re.compile(r'\d+')
    for m in p.finditer('one1two2three3four4'):
        print m.group(),
    
    ### output ###
    # 1 2 3 4
  • sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):

    使用repl替换string中每一个匹配的子串后返回替换后的字符串。

    当repl是一个字符串时,可以使用\id或\g 、\g 引用分组,但不能使用编号0。

    当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。

    count用于指定最多替换次数,不指定时全部替换。

    import re

    p = re.compile(r'(\w+) (\w+)')
    s = 'i say, hello world!'

    print p.sub(r'\2 \1', s)

    def func(m):
    return m.group(1).title() + ' ' + m.group(2).title()

    print p.sub(func, s)

    ### output ###
    # say i, world hello!
    # I Say, Hello World!
    subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):
    返回 (sub(repl, string[, count]), 替换次数)。
    import re

    p = re.compile(r'(\w+) (\w+)')
    s = 'i say, hello world!'

    print p.subn(r'\2 \1', s)

    def func(m):
    return m.group(1).title() + ' ' + m.group(2).title()

    print p.subn(func, s)

    ### output ###
    # ('say i, world hello!', 2)
    # ('I Say, Hello World!', 2)

邮箱/IP正则

  • 判断邮箱合法性

    import re
    pa = '\d' #规则 --->正则表达式
    str1 = 'qaqsqdq12313'
    x = re.findall(pa,str1)
    print(x)

    def is_num(string1):
    pattern = '\w+@\w+\.com' #邮箱正则
    x = re.findall(pattern,string1)
    print(x)
    return x
    while True:
    str1 = input('输入邮箱: ')
    res = is_num(str1)
    if len(res) == 0:
    print('xxxx')
    else:
    print('oooooo')
    break
  • 判断IP合法性

    def is_num(string1):
    pattern = r"^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.)
    {3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$"
    #pattern = r'1\d\d|25[0-5]|2[0-4]\d'

    x = re.findall(pattern, string1)
    print(x)
    return x

    while True:
    str1 = input('输入号码: ')
    res = is_num(str1)
    if len(res) != 1:
    print('xxxx')
    else:
    print('oooooo')
    break
    content = 'Hello 12345 World'

    result = re.match('^Hello\s(\d+)\sWorld', content)
    print(result.group())

贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。

Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

非贪婪的则相反,总是尝试匹配尽可能少的字符。

例如:正则表达式”ab*”如果用于查找”abbbc”,将找到”abbb”。而如果使用非贪婪的数量词”ab*?”,将找到”a”。

content = 'http://weibo.com/comment/kEraCNdsfgkdsfgjkldsjkl'
result1 = re.match('http.*?comment/(.*?)', content)
result2 = re.match('http.*?comment/(.*)', content)
print('result1', result1.group(1)) # 结果 result1
print('result2', result2.group(1)) # 结果 result2 kEraCN

content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(\d+).*Demo$', content)
print(result.group(1)) # 结果
result = re.match('^He.*(\d+).*Demo$', content)
print(result.group(1)) # 结果 7
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设是在国家政策推动下,为深化教育改革、提升教育质量和管理效率而提出的重要项目。该项目旨在通过信息化手段,解决传统教育中存在的资源分散、管理混乱等问题,实现教育资源的高效利用和教学质量的全面提升。 目前,教育信息化虽取得一定进展,但面临“孤岛架构”的挑战,包括硬件资源无法共享、数据孤岛、应用孤岛等问题,导致资源浪费和管理效率低下。为此,智慧校园的建设目标聚焦于家校沟通便捷化、校园管理科学化、校园生活轻松化、课堂教学互动化和校园设施智能化,以提高教学效率和学生学习体验。 智慧校园的核心价值在于构建先进的网络教学平台和管理信息系统,实现教学资源的高效配置和利用,促进师生互动,提高管理效率,降低成本,构建健康高雅的生活环境。解决方案涵盖综合应用平台规划、系统架构设计、媒体发布、数字会议系统等,通过后台服务层、基础接入层和用户接入层的有机结合,实现智慧校园的全面功能。 智慧校园管理平台作为核心组成部分,提供模块化体系,包括公开课、直播、教学资源等23大应用,支持与第三方接口对接,实现多级管理。电教预约管理平台通过移动端APP或web后台简化预约流程,提高教室和会议室资源利用率,支持会议预订、审批、信息发布和环境管控。 教育录播系统和云平台支持教师制作和分享优质教学资源,进行在线组卷和评卷,同时提供学生应用,如高清视频录制、在线直播和互动交流,促进教学资源的共享和教育均衡化发展。这些系统的整合应用,将极大地推动教育信息化进程,实现教育资源的最大化利用和教育质量的全面提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值