正则表达式:学习爬虫必不可少的技能。
python常用re模块来实现正则表达式,所以本文主要是学习re的记录。
一般正则表达式会使用“[]”来,当然还有预设的快捷字符:
d 匹配任何十进制数;它相当于类 [0-9]。 D 匹配任何非数字字符;它相当于类 [^0-9]。 s 匹配任何空白字符;它相当于类 [ tnrfv]。 S 匹配任何非空白字符;它相当于类 [^ tnrfv]。 w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。 W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。 . 匹配除了换行字符以为的任何字符。 ^ 匹配行首。在MULTLINE中,可以匹配每个换行。 $ 匹配行尾。 A 只匹配字符串首。当不在 MULTILINE 模式,A 和 ^ 实际上是一样的。然而,在 MULTILINE 模式里它们是不同的;A 只是匹配字符串首,而 ^ 还可以匹配在换行符之后字符串的任何位置。 Z 只匹配字符串尾。 b 单词边界。这是个零宽界定符(zero-width assertions)只用以匹配单词的词首和词尾。单词被定义为一个字母数字序列,因此词尾就是用空白符或非字母数字符来标示的。 B 另一个零宽界定符(zero-width assertions),它正好同 b 相反,只在当前位置不在单词边界时匹配。
#一般都是使用“”,反斜杠作为开头。在匹配反斜杠时,应使用“r''”,否则你会头疼的。
* 匹配前一个字符任意次数,包含0,即不存在前一个字符 + 匹配前一个字符一次以上 ? 匹配前一个字符一次或零次 {m,n}匹配前一个字符:至少有m个,至多n个 #{0,}等同于*,{1,}等同于+,{0,1}等同于?;使用时建议使用*,+,?
#以上是通用正则表达式基本语法
re模块
- compile()接受可选的标志参数,用来放置正则表达式语句。
- match()决定RE是否在字符串刚开始的位置匹配
- search()扫描字符串,找到这个RE匹配的位置
- findall()找到RE匹配的所有子串,并把它们作为一个列表返回
- finditer()找到RE匹配的所有子串,并把它们作为一个迭代器返回
- group()返回被RE匹配的字符串
- start()返回匹配开始的位置
- end()返回匹配结束的位置
- span()返回一个元组包含匹配(开始,结束)的位置
编译标志
- 编译标志用来改变正则表达式运行方式
- (全名,简写)
- DOTALL,S 使 . ,匹配包含换行在内的所有字符
- IGNORECASE,I 使匹配对大小写不敏感,即关闭大小写
- LOCALE,L 做本地识别(locale-aware)匹配 影响 w, W, b, 和 B,这取决于当前的本地化设置。
- locales 是 C 语言库中的一项功能,是用来为需要考虑不同语言的编程提供帮助的。举个例子,如果你正在处理法文文本,你想用 w+ 来匹配文字,但 w 只匹配字符类 [A-Za-z];它并不能匹配 "é" 或 "ç"。如果你的系统配置适当且本地化设置为法语,那么内部的 C 函数将告诉程序 "é" 也应该被认为是一个字母。当在编译正则表达式时使用 LOCALE 标志会得到用这些 C 函数来处理 w 后的编译对象;这会更慢,但也会象你希望的那样可以用 w+ 来匹配法文文本。
- MULTILINE,M 多行匹配,影响 ^ 和 $
- VERBOSE,X 能够使用 REs 的 verbose 状态,使之被组织的更清晰易懂
举个例子,这里有一个使用 re.VERBOSE 的 RE;看看读它轻松了多少?
#!python charref = re.compile(r"""&[[]] # Start of a numeric entity reference|||here has wrong.i can't fix ( [0-9]+[^0-9] # Decimal form | 0[0-7]+[^0-7] # Octal form | x[0-9a-fA-F]+[^0-9a-fA-F] # Hexadecimal form ) """, re.VERBOSE)
没有 verbose 设置, RE 会看起来象这样:
#!python charref = re.compile("&#([0-9]+[^0-9]" "|0[0-7]+[^0-7]" "|x[0-9a-fA-F]+[^0-9a-fA-F])")
re.match
- 尝试从字符串开始匹配
- 函数原型:re.match(pattern,string,flags)
- pattern为正则表达式
- string为要匹配的字符串
- flags为RE模式
re.search
- 尝试匹配整个字符串
- 函数原型:re.search(pattern,string,flags)
区别 re.match只匹配字符串的开始,如果开始无法匹配,则失败,返回None;而re.search匹配整个字符串。
re.sub
- 替换字符串中的匹配项
- 函数原型:re.sub(pattern,repl,string,sount)
- repl为替换后的字符串
- sount为替换次数,默认为0,全部替换
re.split
- 分割字符串
- 函数原型:re.split(pattern,string,flags)
- 用匹配到的字符串分割整个字符串
re.findall
- 获取字符串中所有匹配的字符串
re.compile
- 可以把正则表达式编译成一个正则表达式对象,用来提高效率,常用。
- pattern不能直接实例化,必须使用re.compile()进行构造
例子
# encoding: UTF-8
import
re
# 将正则表达式编译成Pattern对象
pattern
=
re.
compile
(r
'hello'
)
# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match
=
pattern.match(
'hello world!'
)
if
match:
# 使用Match获得分组信息
print
match.group()
### 输出 ###
# hello
#就到这儿了,目前没有学习实例,先记住匹配方法吧