python正则表达式

 正则表达式

  是一种小型的、高度专业化的编程语言,它内嵌在python中,并通过re模块实现。

    a、可以为想要匹配的相应字符串集指定规则

    b、该字符串集可能包含英文语句、e-mail地址、命令或任何你先搞定的东西

    c、可以问诸如“这个字符串匹配该模式吗?”

    d、也可以使用re以各种方式来修改或分割字符串

    e、正则表达式模式被编译成一系列的字节码,然后由C编写的匹配引擎执行

    f、正则表达式语言相对小型和受限(并非所有的字符串处理都能用正则表达式完成)

1、元字符

  • []

    常用来指定一个字符集:[abc]、[a-z]

     元字符在字符集中不起作用:[akm$]

    补集匹配不在区间范围内的字符:[^5]

  • ^:

    匹配首行。除非设置MULTILINE标志,它只是匹配字符串的开始。在MULTILINE模式  里,它也可以直接匹配字符串中的每个换行。

    如果^在行首,表示匹配以什么开头的,如果^在[]中,则表示取反

  • $

    匹配行尾,行尾被定义为要么是字符串尾,要么是一个换行字符后面的任何位置。

  • \:转义字符:

    用于将元字符转化成普通的符号

    反斜杠后面可以加不同的字符以表示不同特殊意义

      \d:匹配十进制数,相当于[0-9]

      \D:匹配任何非数字字符,相当于[^0-9]

      \s:匹配任何空白字符,相当于[\t\n\r\f\v]

      \S:匹配任何非空白字符,相当于[^\t\n\r\f\v]

      \w:匹配任何字母数字字符,相当于[0-9a-zA-Z]

      \W:匹配任何非字母数字字符,相当于[^0-9a-zA-Z]

  • 重复

    正则表达式第一个功能是能够匹配不定长的字符集,另一个功能就是可以指定正则表达式  的一部分的重复次数

    \d{8}:表示将前面的规则重复8次

    {m,n}:表示至少有m个重复,至多有n个重复。{0,}相当于*,{1,}相当于+,{0,1}相当于?。一般尽量使用*,+或?。

  • *

    指定前一个字符可以被匹配零次或更多次,而不是只有一次。匹配引擎会试着重复尽可能  多的次数。a[abc]*b

  • +

    表示匹配一次或更多次

    匹配一次或零次,可用于标识某事物是可选的

 

实例:

import re
#解释型正则表达式
s = r"^\d{3,4}-?\d{8}$"
string = "010-12345678"
print(re.findall(s, string))

#编译型正则表达式(速度快
s1 = re.compile(s)
print(s1.findall(string))



2、执行匹配
  
a、RegexObject
实例有一些方法和属性,主要列举如下:
    match():决定re是否在字符串刚开始的位置匹配,如果没有匹配返回None,否则返回一个‘Matchobject’对象
    search():扫描字符串,找到re匹配的位置,如果没有匹配返回None,否则返回一个‘Matchobject’对象
    findall():找到re匹配的所有子串,并把它们作为一个列表返回
    finditer():找到re匹配的所有子串,并把它们作为一个迭代器返回
  
b、‘MatchObject’
    
group():返回被re匹配的字符串
    start():返回匹配开始的位置
    end():返回匹配结束的位置
    span():返回一个元组包含匹配(开始,结束)的位置
  ps:实际程序中,最常见的做法是将'MatchObject'保存在一个变量里,然后检查它是否为None,再调用其内部方法

3、编译标志-flag
  
a、
DOTALL,S:使.匹配包括换行在内的所有字符
    
  b、IGNORECASE,I:使匹配对大小写不敏感
    
  c、LOCAL,L:做本地化识别(local-aware)匹配
  d、MULTILINE,M:多行匹配,影响^和$(匹配多行字符串)
    
  e、VERBOSE,X:能够使用REs的verbose状态,使之被组织得更清晰易懂(匹配多行正则表达式)
4、分组
  a、进行邮箱匹配时:email = r"\w{3}@\w+(\.com|\.cn)"
  b、分组会优先返回分组中的匹配片段
    
    
5、使用正则表达式实现一个小爬虫
  
  
注:.*?:实现最小贪婪匹配

import re
import urllib.request

#通过网页地址获取网页源码
def getHtml(url):
page = urllib.request.urlopen(url) #打开网页,返回一个页面对象
html = page.read() #从page对象中获取所有数据
return html

#利用正则表达式从源码中找到所有图片的地址
def getImgUrl(html):
#定义正则老匹配页面,使用元组只获得地址。.*?:最小贪婪匹配
reg = r'src="(https://imgsa.baidu.com/forum/.*?/sign=.*?\.jpg)"'
imgre = re.compile(reg)
imgList = re.findall(imgre, html.decode())
x = 0
for imgurl in imgList:
urllib.request.urlretrieve(imgurl, 'F:/%s.jpg' % x) #下载指定地址的内容
x += 1
html = getHtml("https://tieba.baidu.com/p/4704719514")
getImgUrl(html)


posted @ 2017-03-01 20:46  Miss_wang  阅读(327)  评论(0编辑  收藏  举报