python之正则表达式


我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式!

### 什么叫做正则表达式?

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,正则表达式使用耽搁字符串来描述,匹配一系列符合某个句法规则的字符串。

简单理解,就是对字符串的检索匹配和处理组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

### 为什么会有正则表达式?

想要从返回的页面内容提取出我们想要的内容。

### 正则表达式如何匹配的?


    1.依次拿出表达式和文本中的字符比较,
    2.如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
    3.如果表达式中有量词或边界,这个过程会稍微有一些不同。
 
### 正则表达式的基本语法。

    .    匹配除换行符以外的任意字符
    ^    匹配字符串的开始
    $    匹配字符串的结束
    []   用来匹配一个指定的字符类别
    ?   对于前一个字符字符重复0次到1次
    *    对于前一个字符重复0次到无穷次
    {}   对于前一个字符重复m次
    {m,n} 对前一个字符重复为m到n次
    \d   匹配数字,相当于[0-9]
    \D   匹配任何非数字字符,相当于[^0-9]
    \s   匹配任意的空白符,相当于[ fv]
    \S   匹配任何非空白字符,相当于[^ fv]
    \w   匹配任何字母数字字符,相当于[a-zA-Z0-9_]
    \W   匹配任何非字母数字字符,相当于[^a-zA-Z0-9_]
### 一些记得的知识点

    \b   匹配单词的开始或结束
    \d+匹配1个或更多连续的数字
    \d**匹配重复任意次(可能是0次)
    ^匹配你要用来查找的字符串的开头
    $匹配结尾
    ^\d{5,12}$,匹配5-12的数字
    ^\s{5,12}$,匹配5-12位的字符
    ^\w{5,12}$,匹配5-12位的字母,数字,下划线,或者汉子
    \W \D \B \S 意思刚好相反
    [^x]匹配除了x之外的任意字符
    [^aed]匹配除了aed之外的任意字符
    
    查找 . *  \ 使用\. \* \\
    * 0 - 多次 
    + 1 - 多次
    ? 0 - 1次
    {n} n次
    {n,} n - 多次
    {n,m} n - m 次
      
    \d-->[0-9]
    \w-->[a-z0-9A-Z]

### 一个小小的实例

    \(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8}这个表达式匹配3位区号的电话号码,
    其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,
    也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。

### 正则常用的一些函数用法

    print (re.match('www','www.baidu.com').span())#从起始位置开始
    print (re.search('com','www.baidu.com').span())#未从起始位置开始
    
    re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
    
    在Python中使用正则表达式进行查找
    
    ‘re’模块提供了几个方法对输入的字符串进行确切的查询。我们将会要讨论的方法有:
    
    re.match()
    re.search()
    re.findall()
    
    match匹配字符串的开始位置
    search匹配字符串的任意位置
    >>> match = re.search(r'dog', 'dog cat dog')
    >>> match.group(0)
    'dog'
    
    Python中我使用的最多的查找方法是findall()方法
    
    ['dog', 'dog']
    >>> re.findall(r'cat', 'dog cat dog')
    ['cat']
    
    
    >>> contactInfo = 'Doe, John: 555-1212'
    >>> match = re.search(r'(\w+), (\w+): (\S+)', contactInfo)
    >>> match.group(0)
    'Doe, John: 555-1212'
    >>> match.group(1)
    'Doe'
    >>> match.group(2)
    'John'
    >>> match.group(3)
    '555-1212'

### 实际案例

案例1,

    import re
    pattern=re.compile('hello')
    match=pattern.match('hello world')
    print match.group()

案例2

    import re
    match=re.findall('hello','hello world')
    print match

re模块提供正则表达式的支持
字符串形式编译为Pattern实例;
使用Pattern实例处理文本并获得匹配结果;

案例3,

    import re
    word ='http://www.baidu.com python_1.2'
    key=re.findall('h.',word)
    print key
    匹配.任意一个字符

案例4,

    import re
    word ='http://www.baidu.com python_1.2'
    key=re.findall('\.',word)
    print key
    匹配.转义的字符

案例5,

    import re
    word ='http://www.baidu.com python_1.2'
    key=re.findall('\d\.\d',word)
    print key
    匹配两个数字的字符以及字符.
案例6,

    import re
    word ='httphttp://www.baidu.com python_1.2'
    key=re.findall('http*',word)
    print key
    匹配所有的http
案例7,

    import re
    word ='httphttp://www.baidu.com python_1.2'
    key=re.findall('t{2}',word)
    print key
    匹配所有的http

案例8,
    #!usr/bin/env python 
    #-*- coding:utf_8 -*-
    import urllib
    import re
    html='''
        <div class="one"><div class="aaa" title="白帽子" onclick=......
        '''
    title=re.findall(r'<div class="aaa" title="(.*?)" onclick',html)
    
    for i in title:
        print i
    
    匹配title内容


### 下面的是针对语法做的一些代码操作
    #!usr/bin/env python 
    #-*- coding:utf_8 -*-
    import urllib
    import re
    import os
    pattern=re.compile(r'hello')
    match=pattern.match('hello world')
    if match:
        print match.group()
    else:
        pass
    
    m=re.match(r'aaa','aaaaaaa efe')
    print m.group()
    
    
    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')
    
    
    p=re.compile(r'\=')#根据特殊字符进行分割操作
    a=p.split('cookie=fwefwvb,password=fwefwefwefw')
    print a
    
    
    p=re.compile(r'\d+')#根据特殊字符进行分割
    a=p.split('dwedw1fwefwvb2fwefwe4fwefw')
    print a
    print a[3]
    b=p.findall('dwedw1fwefwvb2fwefwe4fwefw')
    print b
    print b[1]
    
    
    #!/usr/bin/python
    import re
    
    line = "Cats are smarter than dogs"
    
    matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
    
    if matchObj:
       print "matchObj.group() : ", matchObj.group()
       print "matchObj.group(1) : ", matchObj.group(1)
       print "matchObj.group(2) : ", matchObj.group(2)
    else:
       print "No match!!"
    #!/usr/bin/python
    import re
    
    phone = "2004-959-559 # This is Phone Number"
    
    # Delete Python-style comments
    num = re.sub(r'#.*$', "", phone)
    print "Phone Num : ", num
    
    # Remove anything other than digits
    num = re.sub(r'\D', "", phone)    
    print "Phone Num : ", num          '''     f=open('module/test.txt','r')     for line in f.readlines():         payload=line.strip()         #print type(payload)         if len(payload)!=0:             re_telepone=re.match(r'^(\d{3})-(\d{3,20})$', payload)             print re_telepone.group(2)             p=open('module/test2.txt','w')             p.write(re_telepone.group(2))         else:             break     f.close()     p.close()                       '''     '''     test='010-12345'     if re.match(r'\d{3}-\d{3,8}$',test):         print 'ok'     else:         print 'fail'          a=re.split(r'[\s\,]+','a,b,ccc   dd')     print a     a=re.split(r'[\s\,\;]+','a,b,ccc;;;   dd')     print a     reg='Cookie=aaaaa;falg=ddddd'     a=re.split(r'[\s\,\;]+',reg)     print a[1]     a[1]=re.split(r'[\s\,\=]',a[1])     print a[1]     print a[1][1]          reg='Cookie=aaaaa;falg=ddddd'     a=re.split(r'[\s\,\;,\=]+',reg)     print a[3]          print re.match(r'^(\d+)(0*)$','12300').groups()#贪婪          aa=re.match(r'^(\d+?)(0*)$','12300').groups()#非贪婪     print aa     print aa[1]     ''' ### 以后会继续做补充!!!!

posted @ 2016-07-30 11:12 lazy1 阅读(...) 评论(...) 编辑 收藏