zoukankan      html  css  js  c++  java
  • 正则表达式

    一、反射

    cat = Cat('kitty')
     
    print cat.name # 访问实例属性
    cat.sayHi() # 调用实例方法
     
    print dir(cat) # 获取实例的属性名,以列表形式返回
    if hasattr(cat, 'name'): # 检查实例是否有这个属性
        setattr(cat, 'name', 'tiger') # same as: a.name = 'tiger'
    print getattr(cat, 'name') # same as: print a.name
     
    getattr(cat, 'sayHi')() # same as: cat.sayHi()
    • dir([obj]): 
      调用这个方法将返回包含obj大多数属性名的列表(会有一些特殊的属性不包含在内)。obj的默认值是当前的模块对象。
    • hasattr(obj, attr): 
      这个方法用于检查obj是否有一个名为attr的值的属性,返回一个布尔值。
    • getattr(obj, attr): 
      调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为'bar',则返回obj.bar。
    • setattr(obj, attr, val): 
      调用这个方法将给obj的名为attr的值的属性赋值为val。例如如果attr为'bar',则相当于obj.bar = val。

    二、模块补充

    • __doc__: 文档字符串。如果模块没有文档,这个值是None。
    • *__name__: 始终是定义时的模块名;即使你使用import .. as 为它取了别名,或是赋值给了另一个变量名。
    • *__dict__: 包含了模块里可用的属性名-属性的字典;也就是可以使用模块名.属性名访问的对象。
    • __file__: 包含了该模块的文件路径。需要注意的是内建的模块没有这个属性,访问它会抛出异常!
    import fnmatch as m
    print m.__doc__.splitlines()[0] # Filename matching with shell patterns.
    print m.__name__                # fnmatch
    print m.__file__                # /usr/lib/python2.6/fnmatch.pyc
    print m.__dict__.items()[0]     # ('fnmatchcase', <function>)</function>

    json模块:

    实际上JSON就是Python字典的字符串表示,但是字典作为一个复杂对象是无法直接传递,所以需要将其转换成字符串形式.转换的过程也是一种序列化过程.

    用json.dumps序列化为json字符串格式

    >>> import json
    >>> dic {'Connection': ['keep-alive'], 'Host': ['127.0.0.1:5000'], 'Cache-Control': ['max-age=0']}
    >>> jdict = json.dumps({'Connection': ['keep-alive'], 'Host': ['127.0.0.1:5000'], 'Cache-Control': ['max-age=0']})
    >>> print jdict
    {"Connection": ["keep-alive"], "Host": ["127.0.0.1:5000"], "Cache-Control": ["max-age=0"]}

    虽然dic和jdict打印的字符串是相同的,但是实际它们的类型是不一样的.dic是字典类型,jdict是字符串类型

    <type 'dict'>
    >>> type(jdic)
    >>> type(jdict)
    <type 'str'>

    可以用json.dumps序列化列表为json字符串格式

    >>> list = [1, 4, 3, 2, 5] 
    >>> jlist = json.dumps(list)
    >>> print jlist
    [1, 4, 3, 2, 5]

    json.loads把json字符串反序列化为python对象

    son.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

    re模块

    martch和search的区别

            Python提供了两种不同的原始操作:match和search。match是从字符串的起点开始做匹配,而search(perl默认)是从字符串做任意匹配。

     

            注意:当正则表达式是' ^ '开头时,match与search是相同的。match只有当且仅当被匹配的字符串开头就能匹配 或 从pos参数的位置开始就能匹配 时才会成功。如下:

    >>> import re 
    >>> re.match("c", "abcdef") 
    >>> re.search("c","abcdef") 
    <_sre.SRE_Match object at 0x00A9A988>

    >>> re.match("c", "cabcdef") 
    <_sre.SRE_Match object at 0x00A9AB80>

    >>> re.search("c","cabcdef") 
    <_sre.SRE_Match object at 0x00AF1720>

    >>> patterm = re.compile("c") 
    >>> patterm.match("abcdef") 
    >>> patterm.match("abcdef",1) 
    >>> patterm.match("abcdef",2) 
    <_sre.SRE_Match object at 0x00A9AB80>

    3.模块内容

    re.compile(pattern, flags=0)

     

    编译正则表达式,返回RegexObject对象,然后可以通过RegexObject对象调用match()和search()方法。

     

    prog = re.compile(pattern)

    result = prog.match(string)

    result = re.match(pattern, string)

    是等价的。

     

    第一种方式能实现正则表达式的重用。

     

    re.search(pattern, string, flags=0)

     

    在字符串中查找,是否能匹配正则表达式。返回_sre.SRE_Match对象,如果不能匹配返回None。

     

    re.match(pattern, string, flags=0)

     

    字符串的开头是否能匹配正则表达式。返回_sre.SRE_Match对象,如果不能匹配返回None。

     

    re.split(pattern, string, maxsplit=0)

     

    通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。

    >>> re.split('W+', 'Words, words, words.') 
    ['Words', 'words', 'words', ''] 
    >>> re.split('(W+)', 'Words, words, words.') 
    ['Words', ', ', 'words', ', ', 'words', '.', ''] 
    >>> re.split('W+', 'Words, words, words.', 1) 
    ['Words', 'words, words.'] 
    >>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)

     

    注意:我使用的Python是2.6,查看源代码发现split()并没有flags的参数,2.7才增加。这种问题我发现不止一次了,官方的文档 跟 源码不一致的现象,如果发现异常,应该去源码中找找原因。

     

    如果在字符串的开始或结尾就匹配,返回的list将会以空串开始或结尾。

    >>> re.split('(W+)', '...words, words...') 
    ['', '...', 'words', ', ', 'words', '...', '']

     

    如果字符串不能匹配,将会返回整个字符串的list。

    >>> re.split("a","bbb") 
    ['bbb']

     

    re.findall(pattern, string, flags=0)

     

    找到 RE 匹配的所有子串,并把它们作为一个列表返回。这个匹配是从左到右有序地返回。如果无匹配,返回空列表。

    >>> re.findall("a","bcdef") 
    []

    >>> re.findall(r"d+","12a32bc43jf3") 
    ['12', '32', '43', '3']

     

    re.finditer(pattern, string, flags=0)

     

    找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。这个匹配是从左到右有序地返回。如果无匹配,返回空列表。

    >>> it = re.finditer(r"d+","12a32bc43jf3") 
    >>> for match in it: 
                  print match.group()

    12 
    32 
    43 
    3

     

    re.sub(pattern, repl, string, count=0, flags=0)

     

    找到 RE 匹配的所有子串,并将其用一个不同的字符串替换。可选参数 count 是模式匹配後替换的最大次数;count 必须是非负整数。缺省值是 0 表示替换所有的匹配。如果无匹配,字符串将会无改变地返回。

     

    re.subn(pattern, repl, string, count=0, flags=0)

     

    与re.sub方法作用一样,但返回的是包含新字符串和替换执行次数的两元组。

     

    re.escape(string)

     

    对字符串中的非字母数字进行转义

     

    re.purge()

     

    清空缓存中的正则表达式

     

    4.正则表达式对象

     

    re.RegexObject

     

    re.compile()返回RegexObject对象

     

    re.MatchObject

     

    group()返回被 RE 匹配的字符串

    start()返回匹配开始的位置

    end()返回匹配结束的位置

    span()返回一个元组包含匹配 (开始,结束) 的位置

     

    cat = Cat('kitty')
     
    print cat.name # 访问实例属性
    cat.sayHi() # 调用实例方法
     
    print dir(cat) # 获取实例的属性名,以列表形式返回
    if hasattr(cat, 'name'): # 检查实例是否有这个属性
        setattr(cat, 'name', 'tiger') # same as: a.name = 'tiger'
    print getattr(cat, 'name') # same as: print a.name
     
    getattr(cat, 'sayHi')() # same as: cat.sayHi()
  • 相关阅读:
    VS2012打包部署Winform程序
    WPF 触发器Triggers
    VS2010中的顺序图
    decimal,float和double的区别
    EXCEL基本知识
    java byte 循环左移 循环右移 rotateLeft rotateRight
    博客地址转移
    PHP学习思维导图
    一款web前端在线编辑器
    9patch android .9格式使用
  • 原文地址:https://www.cnblogs.com/lidong94/p/5595139.html
Copyright © 2011-2022 走看看