分类: LINUX
2013-12-16 09:36:15
* +
- 表示匹配一或更多次
- 注意*和+之间的不同;*匹配0次或更多次,所以可以根本就不出现,而+则要求至少出现一次
* ?
- 匹配一次货零次;你可以认为它用于标识某事物是可选的
r=r"^010-\d{8}"
r=r"^\d{3}-?\d{8}"
re.compile(r) 对于经常使用的规则可以进行编译,速度会比未编译的速度快很多
csvt_re = re.compile(r'csvt',re.I) 不区分大小写
csvt_re.findall('CsVt')
- re.compile()也可接受可选的标志参数,常用来实现不同的特殊功能和语法变更
- 反斜杠的麻烦
字符串前加“r”就不会被任何特殊方式处理
\section 要匹配的字符串
\\section 为re.compile取消反斜杠的特殊意义
"\\\\section" 为“\\section”的字符串实值(string literals)取消反斜杠的特殊意义
* 执行匹配
- ‘RegexObject’实例有一些方法和属性,完整的列表可查阅Python Library reference
match() 决定RE是否在字符串刚开始的位置匹配
search() 扫描字符串,找到这个RE匹配的位置
findall() 找到RE匹配的所有子串,并把它们作为一个列表返回
finditer() 找到RE匹配的所有子串,并把它们作为一个迭代器返回
- MatchObject实例方法
group() 返回被RE匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元祖包含匹配(开始,结束)的位置
* 实际程序中,最常见的作法是将'MatchObject'保存在一个变量,然后检查它是否为none
#!python
p = re.compile()
m = p.match('string goes here')
if m:
print 'Match found:', m.group()
else
print 'No match'
* 模块级函数
- re模块也提供了顶级函数调用,如match(),search(),sub(),subn(),split(),findall()等
---------------------
re属性-分组
* 编译标志 - flags
DOTALL,S 使.匹配包括换行在内的所有字符
IGNORECASE,I 使匹配对大小写不敏感
LOCALE,L 做本地化识别(locale-aware)匹配法语等‘e’或‘c’
MULTILINE,M 多行匹配,影响^和$
VERBOSE,X 能够使用REs的verbose状态,使之被组织得更清晰易懂
>>> s = """
... hello csvt
... csvt hello
... hello nsun
... hello csvt nsun
... csvt hehe
... """
>>> re.findall(r,s,re.M)
['csvt', 'csvt']
--------
>>> re.findall(r,s,re.M)
['csvt', 'csvt']
>>> tel = r"""
... \d{3}
... -?
... \d{8}
... """
爬虫实例: 从网页上下载图片
#!/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)\" pic_ext"
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,"%s.jpg" %x)
x += 1
return x
html = getHtml("")
print getImg(html)