Python正则表达式学习

正则表达式:学习爬虫必不可少的技能。

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

#就到这儿了,目前没有学习实例,先记住匹配方法吧

Leave a Reply

Your email address will not be published. Required fields are marked *