python2.x学习笔记(11) -- 正则表达式

1. 正则表达式(RE)为高级文本模式匹配,以及搜索-替代等功能提供了基础。正则表达式(RE)是一些由字符和特殊符号组成的字符串,它们描述了这些字符和字符的某种重复方式,因此能按某种模式匹配一个有相似特征的字符串的集合,因此能按某模式匹配一系列有相似特征的字符串,换句话说,它们能匹配多个字符串 - 一个只能匹配一个字符串的 RE 模式是乏味且毫无作用的,你说是不是?

2. 在 Python专门术语中,有两种主要方法完成模式匹配:搜索(searching)和匹配(matching)。搜索,即在字符串任意部分中查找匹配的模式,而匹配是指,判断一个字符串能否从起始处全部或部分的匹配某个模式。搜索通过 search()函数或方法来实现,而匹配是以调用 match()函数或方法实现的。

3. 常用正则表达式符号和特殊字符
记号       说明         举例
literal 匹配字符串的值         foo
re1|re2 匹配正则表达式re1或re2           foo|bar
. 匹配任何字符(换行除外)         b.b
^ 匹配字符串的开始         ^dear
$ 匹配字符串的结尾         /bin/*sh$
* 匹配前面出现的正则表达式0次或多次   [A-Za-z0-9]*
+ 匹配前面出现的正则表达式1次或多次 [a-z]+\.com
? 匹配前面出现的正则表达式0次或一次 goo?
{N} 匹配前面出现的正则表达式N次 [0-9]{3}
{M,N} 匹配重复出现M次到N次的正则表达式 [0-9]{5,9}
[...] 匹配字符组里出现的任意一个字符 [aeiou]
[..x-y..] 匹配从字符x到y中的任意一个字符 [a-h],[0-9]
[^...] 不匹配此字符集中出现的任何一个字符 [^aeiou],[^A-Za-z0-9_]
(*|+|?|{})? 用于上面出现的任何“非贪婪”版本重复匹配次数符号(*,+,?,{})   .*?[a-z]

特殊字符
\d 匹配任何数字,和[0-9]一样(\D是\d的反义) data\d+.txt
\w 匹配任何数字字母字符,等同于[A-Za-z0-9_](\W是\w的反义)  [A-Za-z_]\w+
\s 匹配任何空白符,等同于[ \n\t\r\v\f] (\S是\s的反义)   of\sthe
\b 匹配单词边界(\B 是 \b 的反义) \bThe\b
\nn 匹配已保存的子组 price: \16
\c 逐一匹配特殊字符c \., \\, \*
\A (\Z) 匹配字符串的起始(结束) \ADear

4. 特殊字符 \b and \B 用来匹配单词边界。两者之间的区别是,\b 匹配的模式是一个单词边界,就是说,与之对应的模式一定在一个单词的开头,不论这个单词的前面是有字符(该词在一个字符串的中间), 还是没有字符(该单词在一行的起始处)。同样地, 只匹配出现在一个单词中间的模式(即,\B不在单词边界上的字符)。看下面几个例子:
  RE Pattern     Strings Matched                
  the            任何包含有"the"的字符串
  \bthe          任何以"the"开始的字符串
  \bthe\b        仅匹配单词 “the”
  \Bthe          任意包含“the”但不以“the”开头的单词

5. 使用闭包操作符 ( *, +, ?, {} ) 实现多次出现/重复匹配
  在上表中,我们注意到问号出现了不只一次(被重载),问号有两种含义:1.单独使用时表示匹配出现零次或一次的情况,2.紧跟在表示重复的元字符后面时,表示要求搜索引擎匹配的字符串越短越好。例如:(+?)
  前面提到"越短越好..."是什么意思呢?当使用了表示重复的元字符(*+?{m,n})时,正则表达式引擎在匹配模式时会尽量"吸收"更多的字符。这就叫做"贪心"。问号告诉正则表达式引擎尽可能地偷懒,要求当前匹配消耗的字符越少越好,留下尽可能多的字符给后面的模式(如果存在)。

6. 用圆括号(()) 组建组
我们不仅想知道是否整个字符串匹配我们的条件(正则表达式),还想在匹配成功时取出某个特定的字符串或子字符串。要达到这个目的,只需要给正则表达式的两边加上一对圆括号。
  使用圆括号的一个额外好处就是匹配的子串会被保存到一个子组,便于今后使用。这些子组可以在同一次匹配或搜索中被重复调用,或被提取出来做进一步处理。

7. 常见的正则表达式函数与方法
函数/方法                           描述
re 模块的函数
compile(pattern,flags=0)      
对正则表达式模式 pattern 进行编译,flags 是可选标志符,并返回一个 regex 对象

re 模块的函数和 regex 对象的方法
match(pattern,string, flags=0)  
尝试用正则表达式模式 pattern 匹配字符串 string,
flags 是可选标志符,如果匹配成功,则返回一个匹配对
象;否则返回 None
search(pattern,string, flags=0)     
在字符串 string 中查找正则表达式模式 pattern 的第一次出现,flags 是可选标志符,如果匹配成功,则返回一个匹配对象;否则返回 None
findall(pattern,string[,flags])     
在字符串 string 中查找正则表达式模式 pattern 的所有(非重复)出现;
返回一个匹配对象的列表
finditer(pattern,string[, flags])
和 findall()相同,但返回的不是列表而是迭代器;对于每个匹配,该迭代器返回一个匹配对象

8. 常见的正则表达式函数与方法(继续)
函数/方法                                描述
匹配对象的方法
split(pattern,string, max=0)    
根据正则表达式 pattern 中的分隔符把字符 string 分割为一个列表,返回成功匹配的列表,最多分割 max 次(默认是分割所有匹配的地方)。
sub(pattern, repl, string, max=0)
把字符串 string 中所有匹配正则表达式 pattern 的地方替换成字符串 repl,
如果 max 的值没有给出,则对所有匹配的地方进行替换(另外,请参考 subn(),它还会返回一个表示替换次数的数值)。
group(num=0)          返回全部匹配对象(或指定编号是 num 的子组)
groups()    返回一个包含全部匹配的子组的元组(如果没有成功匹配,就返回一个空元组)

9. 使用 compile()编译正则表达式
在处理正则表达式时, regex 对象外,还有另一种对象类型 - 匹配对象。这些对象是在 match()或 search()被成功调用之后所返回的结果。匹配对象有两个主要方法:group() 和 groups().

10. Python 原始字符串(raw strings)的用法
原始字符串的产生正是由于有正则表达式的存在。原因是 ASCII 字符和正则表达式特殊字符间所产生的冲突。比如,特殊符号“\b”在ASCII 字符中代表退格键,但同时“\b”也是一个正则表达式的特殊符号, 代表“匹配一个单词边界”.                     
为了让 RE 编译器把两个字符“\b”当成你想要表达的字符串,而不是一个退格键,你需要用另一个反斜线对它进行转义,即可以这样写:“\\b”.

你可能感兴趣的:(搜索引擎,正则表达式,python,F#)