正则表达式

一、反射

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()
posted on 2016-06-17 21:00  李栋94  阅读(174)  评论(0编辑  收藏  举报