16、正则表达式
影响 专业 想要 20 亿 小型 取消 最好 法语 完全匹配
目标
案例
简介
- 正则表达式(或 re)是一种小型的、高度专业化的编程语言,(在 python 中)它内嵌在 python 中,并通过 re 模块实现
- 可以为想要匹配的相应字符串集指定规则
- 该字符集可能包含英文语句、e-mail 地址、命令或任何你想搞定的东西
- 可以问诸如 "这个字符串匹配该模式吗"
- "在这个字符串中是否有部分匹配该模式呢?"
- 你也可以使用 re 以各种试来修改或分割字符串
- 正则表达式模式被编译成一系列的字节码,然后由 C 编写的匹配引擎执行
- 正则表达式语言相对小型和受限(功能有限)
字符匹配
- 普通字符
- 大多数字母和数字一般都会和自身匹配
- 如正则表达式 test 会和字符串 "test" 完全匹配
- 元字符
- . ^ $ * +?{} []\ | ()
- []
- ^
- 匹配行首。除非设置 MULTILINE 标志,它只是匹配字符串的开始。在 MULTILINE 模式里,它也可以匹配字符串中的每个换行。
- $
- 匹配行尾,行尾被定义为要么是字符串尾,要么是一个换行字符后面的任何位置。
- \
- 重复
- 正则表达式第一功能是能够匹配不定长的字符集,另一个功能就是可以指定正则表达式的一部分的重复次数。
- *
- 指定前一个字符可能被匹配零次或更多次,而不是只有一次。匹配引擎会试着重复尽可能多的次数(不超过整数界定范围,20 亿)
- +
- 表示匹配一次或更多次
- 注意和 + 之间的不同:匹配零或更多次,所以可以根本不出现,而 + 则要求至少出现一次
- ?
- 匹配一次或零次,你可以认为它用于标识某事物是可选的
- {m,n}
- 其中 m 和 n 是十进制整数。该限定符的意思是至少有 m 个重复,至多到 n 个重复
- 忽略 m 会认为下边界是 0,而忽略 n 的结果将是上边界为无穷大(实现上是 20 亿)
- {0,}等同于 *,{1,}等同于 +,而 {0,1} 则与? 相同。如果可以的话,最好使用 *,+ 或?
使用正则表达式
- re 模块提供了一个正则表达式引擎的接口,可以让你将 REstring 编译成对象并用它们来进行匹配
- 编译正则表达式
- >>> import re
- >>> p = re.compile('ab*')
- >>> print p
- <_sre.SRE_Pattern object at 0x00000000004D1CA8>
- re.compile() 也可以接受可选择的标志参数,常用来实现不同的特殊功能和语法变更
- p = re.compile('ab*', re.IGNORECASE)
反斜杠的麻烦
- 字符串前加 "r" 反斜杠就不会被任何特殊方式处理
\section |
要匹配的字符串 |
\section |
为 re.compile 取消反斜杠的特殊意义 |
"\\section" |
为 "\section" 的字符串实值(string literals)取消反斜杠的特殊意义 |
执行匹配
- 'RegexObject'实例有一些方法和属性,完整的列表可查阅 Python Library Reference
match() |
决定 RE 是否在字符串刚开始的位置匹配 |
search() |
扫描字符串,找到这个 RE 匹配的位置 |
findall() |
找到 RE 匹配的所有子串,并把它们作为一个列表返回 |
finditer() |
找到 RE 匹配的所有子串,并把它们作为一个迭代器返回 |
- 如果没有匹配到的话,match()和search()将返回None。
- 如果成功的话,就会返回一个'MatchObject'实例。
group() |
返回被 RE 匹配的字符串 |
start() |
返回匹配开始的位置 |
end() |
返回匹配结束的位置 |
span() |
返回一个元组包含匹配(开始,结束)的位置 |
模块级函数
编译标志 - flags
DOTALL, S |
使. 匹配包括换行在内的所有字符 |
IGNORECASE, I |
使匹配对大小写不敏感 |
LOCALE, L |
做本地化识别(local-aware)匹配. 法语等 |
MULTILINE, M |
多行匹配,影响 ^ 和 $ |
VERBOSE, X |
能够使用 REs 的 verbose 状态,使之被组织得更清晰易懂 |
- charref = re.compile(r """
- (
- [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)
分组 ()
- email = r "\w+@\w+(\.com|\.cn)"
一个小爬虫
- 下载贴吧或空间中所有图片
- import re
- import urllib
- def gethtml(url):
- page = urllib.urlopen(url)
- html = page.read()
- return html
- def getImg(html):
- reg = r'src="(.*?\.jpg)" width'
- imgre = re.compile(reg)
- imglist = re.findall(imgre, html)
- x = 0
- for imgurl in imglist:
- urllib.urlretrieve(imgurl, '%s.jpg' % x)
- x++
- getImg(getHtml(url))
16、正则表达式
来源: http://www.bubuko.com/infodetail-2447685.html