(06)正则表达式

温馨提醒:
import re     要导入正则模块
s=r'abc'    r代表保留字符原义 ,不会被任何特殊方式处理 可以元字符简化 s=r'[a-c]'
re.findall(s,'abckkkkk')   返回匹配到s规则 字符列表
==================================

■ 字符匹配
    ● 普通字符 :字母、字符 匹配自己,如: a  匹配 a  ,hello 匹配 hello
    ● 元字符:.  ^  $  *  +  ?  { }  [ ]  \  |  ( )
        ◆ [ ]  : a.  指定一个字符集 [abc]; [a-z]
                  b.  元字符在字符集不起作用,只相当于一个普通的符号 [abc$] 这时$只是一个美元符号
                  c.  补集匹配不在区间范围内的字符 [^34a]  -- 表示不在34a 其中一个  取反  一定要字符集开头
                       在其他地方,就相当一人普通的^ 符号;
        ◆ ^  : 匹配行首,只匹配字符串的开始 ^world   只匹配 world开的 ,行中的不匹配
        ◆ $   : 匹配行尾,匹配字符串尾,或换行字符后面的任何位置  boy$  只匹配boy结尾的字符串
        ◆ \   :  a.取消元字符,使它成为普通的字符  \\ \{  \$  ……
                  b. 跟不同的字母有不同的意义(大写字母,具有取反的意思):
                      \d 匹配一个数字字符。等价于 [0-9]
                      \D 匹配一个非数字字符。等价于 [^0-9]
                      \s  匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
                      \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
                      \w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
                      \W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
        ◆ |   :  x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 
        ◆ *   : 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。zo*?  非贪婪匹配
        ◆ +  : 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。zo+? 非贪婪匹配
        ◆ ? : 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
        ◆ { }  : a. {n} 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
                  b. {n,}  n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。
                      'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 
                  c. {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, "o{1,3}" 将匹配 "fooooood" 中的前三个 o。
                     'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
      "\d{3,4}-?\d{8}"   电话
■ 常用函数
    ● re.compile()  编译,这样速度会更快
        r1=r"\d{3,4}-?\d{8}"
        p_tel=re.compile(r1)
        p_tel=findall('010-12345678')
         p_tel=re.compile(r1,re.I)    #不区分大小写
    ● match()  search() findall()  finditer()    sub()  subn()  split()
    ● matchobject 对象 group() start() end() span()

■ 编译标志
    ● S :使 . 匹配包括换行在内的所有字符    针对正则表达
    ● I  : 使匹配对大小写不敏感                   针对字符串
    ● L :做本地化识别
    ● M:多行匹配                                    针对字符串
    ● X:正则本身多行书写                         针对正则表达
    s="""
         hello work
         ok
         """
     re.findall(r"^hello",s,re.M)
     
    tel=r"""
           \d{3,4}
            -?
           \d{8}
          """
      re.findall(tel,'010-12345678',re.X)

■ 分组  (  )
    ● 有或时,一般要用到 email=r"\w{3}@\w(\.com|\.cn)"
    ● 返回自己感兴趣的内容 (.*)

■ 爬虫
#!/usr/bin/python
import re
import urllib

def getHtml(url):
     page=urllib.urlopen(url);
     html= page.read()
     return html

def getImg(html):
      reg = r'src="(.+?\.jpg)" width'
      imgre = re.compile(reg)
      imglist = re.findall(imgre,html)
      x=0
      for imgurl in imglist:
           urllib.urlretrieve(imgurl,'%s.jpg' % x)
            x+=1

posted @ 2016-02-18 10:32  toby2chen  阅读(210)  评论(0编辑  收藏  举报