• Python正则表达式


    1.数量词的贪婪模式与非贪婪模式
    正 则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪 的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量 词"ab*?",将找到"a"。

    2.反斜杠的困扰
    与 大多数编程语言相同,正则表达式里使用""作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达 式里将需要4个反斜杠"\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。 Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\"表示。同样,匹配一个数字的"\d"可以写成r"d"。 有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

    3.Python常用正则表达式
    一定要掌握的几个
    ? 匹配 0 个或一个, 另外在非贪婪模式,最小化匹配时有用。python 默认是贪婪模式匹配的。
    . 匹配任何非换行字符,但可以通过 re.S  绕过这一点.
    + 匹配一个或多个
    * 匹配0个或多个.
    [] 匹配里面的任何一个字符
    [^  ] 不匹配里面的任何一个字符. 在 [] 中所有字符均失去特殊意义,比如'.' 不再代表仍何非换行字符,就是代表'.' 号 .
    {} 匹配个数 ,比如{3}表示匹配3个,{1,3} 表示可以匹配1个到3个。
    ^  匹配字符串开始
    $  匹配字符串结束
    d 匹配任何数字,也就是0-9
    D 匹配仍何非数字 [^0-9] 与 d 相反
    w 匹配数字和字幕 0-9 a-z A-Z
    W 与w 相反
    s 匹配空白字符,比如 v f
    S 与 s 相反
    本身,转义符. 比如要明确的匹配'.'号,就应该用'.' 否则  '.' 代表匹配任何非换行符了

    4. re模块
    Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。

    pattern= re.compile(r'hello') # 将正则表达式编译成Pattern对象
    match= pattern.match('hello world!') # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
    if match:
        print match.group() # 使用Match获得分组信息
    # hello

    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): 点任意匹配模式,改变'.'的行为

    re 提供了众多模块方法用于完成正则表达式的功能。这些方法可以使用Pattern实例的相应方法替代,唯一的好处是少写一行re.compile()代码, 但同时也无法复用编译后的Pattern对象。这些方法将在Pattern类的实例方法部分一起介绍。如上面这个例子可以简写为:
    m= re.match(r'hello','hello world!')
    print m.group()

    re模块还提供了一个方法escape(string),用于将string中的正则表达式元字符如*/+/?等之前加上转义符再返回,在需要大量匹配元字符时有那么一点用。

    re.match详解
    re.match 尝试从字符串的开始匹配一个模式。
    import re
    text = 'JGood is a handsome boy, he is cool, clever, and so on...'
    m = re.match(r'(w+)s(w+)', text)
    if m:
        print m.group(0), ' ', m.group(1)
    else:
        print'not match'

    re.search
      re.search函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
    import re
    text = “JGood is a handsome boy, he is cool, clever, and so on…”
    m = re.search(r’shan(ds)omes’, text)
    if m:
        print m.group(0), m.group(1)
    else:
        print ‘not search’
    re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

    re.sub
      re.sub用于替换字符串中的匹配项。下面一个例子将字符串中的空格 ‘ ‘ 替换成 ‘-’ :
    import re
    text = “abcde”
    print re.sub(r’s+’, ‘-’, text)
    re.sub(r’s’, lambda m: ‘[' + m.group(0) + ']‘, text, 0);将字符串中的空格’ ‘替换为’[ ]‘。

    re.split
      可以使用re.split来分割字符串,如:re.split(r’s+’, text);将字符串按空格分割成一个单词列表。

    re.findall
      re.findall可以获取字符串中所有匹配的字符串。如:re.findall(r’w*oow*’, text);获取字符串中,包含’oo’的所有单词。

    5. 常用正则表达式例子
    5.1 数字
    import re
    nStr = '123'
    p = re.compile(’^d+$’,re.S)        #非负整数(正整数与零)
    #p = re.compile(’^[0-9]*[1-9][0-9]*$’,re.S)      #正整数(不包括零在内)
    #p = re.compile(’^((-d+)|(0+))$’,re.S) #非正整数(负整数+0)
    #p = re.compile(’^-[0-9]*[1-9][0-9]*$’,re.S) #负整数
    #p = re.compile(’^-?d+$’,re.S) #整数
    #p = re.compile(’^d+(.d+)?$’,re.S) #非负浮点数(正浮点数 + 0)
    #p = re.compile(’^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$’,re.S) #正浮点数
    #p = re.compile(’^((-d+(.d+)?)|(0+(.0+)?))$’,re.S)  #非正浮点数(负浮点数 + 0)
    # p = re.compile(’^(-?d+)(.d+)?$’,re.S) #浮点数
    if p.match(nStr):
        print 'exists'
    else:
        print 'not'

    5.2 字符相关
    26个英文字母组成的字符串
    import re
    nStr = 'abck'
    p = re.compile('^[A-Za-z]+$',re.S)
    if p.match(nStr):
        print “exists”
    else:
        print “not”
    如果是大写的话就是:^[A-Z]+$
    如果是小写的话就是:^[a-z]+$
    如果是数字与字母组合:^[A-Za-z0-9]+$
    如果由数字、26个字母、或下划线组成的:^w+$

    5.3 HTML相关
    5.3.1 匹配<script>标签的
    #coding:utf-8
    import re
    nStr = “<script src=’…js’></script>”
    p = re.compile(’<s*script[^>]*>[^<]*<s*/s*scripts*>’,re.I)
    if p.match(nStr):
        print “exists”
    else:
        print “not”

    5.3.2 匹配<style>标签
    #coding:utf-8
    import re
    nStr = '<style  11> <11</style>'
    p = re.compile('<s*style[^>]*>[^<]*<s*/s*styles*>',re.I)#[^<]表示所有的非<符号的字符
    if p.match(nStr):
           print'exists'
    else:
           print'not'

    5.3.3 匹配HTML标签
    #coding:utf-8
    import re
    nStr = '<div>'
    p = re.compile('</?w+[^>]*>',re.I)
    if p.match(nStr):
        print 'exists'
    else:
        print 'not'

    5.4 匹配EMAIL地址
    import re
    nStr = 'hkebao@126.com'
    p = re.compile('^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$',re.S)
    if p.match(nStr):
        print 'exists'
    else:
        print 'not'

    5.5 匹配URL
    import re
    nStr = 'http://localhost'
    p = re.compile(’^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$’,re.S)
    if p.match(nStr):
        print 'exists'
    else:
        print 'not'
  • 相关阅读:
    JSP+JDBC+Servlet--基于数据库的登陆验证
    简单的购物车设计
    控制网页的访问时间
    JSP+JavaBean设计模式
    关于doGet和doPost的疑问
    IDEA连接SQL Server
    no sqljdbc_auth in java.library.path com.microsoft.sql 没有为集成身份验证配置驱动程序。
    数组的属性排序
    关于AFNetworking的Assertion failure崩溃
    C++中static关键字作用总结
  • 原文地址:https://www.cnblogs.com/oskb/p/5160366.html
Copyright © 2020-2023  润新知