chapter15 正则表达式

核心编程


正则表达式使用的特殊符号和字符

记号         说明                                         举例

literal       匹配字符串的值                             foo


re1|re2       匹配字符串1或者2 foo|bar



.              匹配任意字符(换行符除外)             b.b


^               匹配字符串的开始                      ^bar

$                匹配字符串的结尾                      bar$


*               匹配前面出现的正则表达式零次或多次     bar*


+               匹配前面出现的正则表达式一次或多次     bar+


?                匹配前面出现的正则表达式一次或零次    bar?



{N}                匹配前面出现的正则表达式N次       [0-9]{5}


{M,N}              匹配重复出现M次到N次的正则表达式   [0,9]{6,9}


[...]             匹配字符组里出现的任意一个字符      [dghjkl]


[..X-Y..]         匹配从字符x到y中的任意一个字符      [0-9a-z]


[^...]           不匹配此字符集中出现的任意一个字符   [^dghjkl]


(*|+|?|{})?       由于上面出现的任何‘非贪婪’版本重复匹配次数符号   .*?[a-z]

                   (*,+,?,{})


(...)            匹配封闭括号中正则表达式(RE),并保持为子组   ([0-9]{3}?,f(oo|u)bat)





special characters


\d        匹配任何数字,和[0-9]一样(\D是\d的反义:任何非数字符)      data\d+.txt


\w        匹配任何数字字母字符,和[A-Za-z0-9]相同(\W是\w的反义)    [A-Za-z_]\w+


\s        匹配任何空白符,和[\n\t\r\f]相同,(\S是\s的反义)           of\sthe


\b        匹配单词的边界(\B是\b的反义)                                \blove\b


\nn       匹配已保存的子组                                         print:\16


\c        逐一匹配特殊字符c                                        \.,\*,\\,\?


\A (\Z)  匹配字符串的起始(结束)                                   \Adear



\A 和^是一样的,\Z 和$是一样的。


^/$ /\b /\B

“matching”和“searching” 之间的区别,“matching”是试图从整个字符串的开头进行匹配,而 “searching” 则可从一个字符串的任意位置开始匹配。正因为这几个字符和搜索的位置有关,所以需要和搜索模式一起使用

示例:


^From 匹配任何以From 开始的字符串

/bin/tcsh$ 匹配任何以 /bin/tcsh 结束的字符串

^Subject: hi$ 匹配仅由 Subject: hi 组成的字符串


RE Pattern Strings Matched

the 任何包含有"the"的字符串

\bthe 任何以"the"开始的字符串

\bthe\b 仅匹配单词 “the”

\Bthe 任意包含“the”但不以“the”开头的单词



创建字符类[]:[abcd],[1-9]匹配其中任意一个字符, 很简单没什么好说的

使用闭包操作符 ( *, +, ?, {} ) 实现多次出现/重复匹配


'?'的特殊作用:

问号出现了不只一次(被重载),问号有两种含义:1.单独使用时表示匹配出现零次或一次的情况,2.紧跟在表示重复的元字符后面时,表示要求搜索引擎匹配的字符串越短越好。例如:(+?)




match 和searching的区别:

match:匹配是指,判断一个字符串能否从起始处全部或部分的匹配某个模式

searching;搜索,即在字符串任意部分中查找匹配的模式


常见的正则表达式函数与方法


函数/方法                      描述

re 模块的函数

compile(pattern,flags=0)      对正则表达式模式pattern 进行编译,flags 是可选标志符,并返回一                               个regex 对象


match(pattern,string, flags=0)  尝试用正则表达式模式pattern 匹配字符串string,flags 是可选标志                                符,如果匹配成功,则返回一个匹配对象;否则返回None


search(pattern,string, flags=0) v在字符串string 中查找正则表达式模式pattern 的第

                                 一次出现,flags 是可选标志符,如果匹配成功,则返回一个匹配对                                 象;否则返回None


findall(pattern,string[,flags])  在字符串string 中查找正则表达式模式pattern 的所有(非重复)出                                    现;返回一个匹配对象的列表

finditer(pattern,string[, flags])  和findall()相同,但返回的不是列表而是迭代器;对于每个匹配                                    ,该迭代器返回一个匹配对象


split(pattern,string, max=0)          根据正则表达式pattern 中的分隔符把字符string 分割为一个                                    列表,返回成功匹配的列表,最多分割max 次(默认是分割所有匹                                    配 的地方)。


sub(pattern, repl, string, max=0)       把字符串string 中所有匹配正则表达式pattern 的地方替换                                          成字符串repl,如果max 的值没有给出,则对所有匹配的地                                        方进行替换(另外,请参考subn(),它还会返回一个表示替换                                          次数的数值)。

group(num=0)                           返回全部匹配对象(或指定编号是num 的子组)

groups()                             返回一个包含全部匹配的子组的元组(如果没有成功匹配,就返                                      回一个空元组)



m=re.match('foo','foo')

if m is not None:

    m.group()


核心笔记 : Python 原始字符串(raw strings)的用法

你可能已经看到前面关于原始字符串用法的一些例子了。原始字符串的产生正是由于有正则表

达式的存在。原因是ASCII 字符和正则表达式特殊字符间所产生的冲突。比如,特殊符号“\b”在

ASCII 字符中代表退格键,但同时“\b”也是一个正则表达式的特殊符号,代表“匹配一个单词边界”。

为了让RE 编译器把两个字符“\b”当成你想要表达的字符串,而不是一个退格键,你需要用另一个

反斜线对它进行转义,即可以这样写:“\\b”。

但这样做会把问题复杂化,特别是当你的正则表达式字符串里有很多特殊字符时,就更容

易令人困惑了。在第六章,我们曾介绍过原始字符串,它经常被用于简化正则表达式的复杂程度。

事实上,很多Python 程序员在定义正则表达式时都只使用原始字符串。

(r'\bblow')



正则表达式示例:


from random import randint, choice

from string import lowercase

from sys import maxint

from time import ctime


doms = ( 'com', 'edu', 'net', 'org', 'gov' )

t=range(randint(5, 10))

print t

for i in t:

    dtint=randint(0, maxint-1) # pick date

    print dtint

    dtstr=ctime(dtint) # date string


    shorter = randint(4, 7) # login shorter

    em = ''

    for j in range(shorter):

        em += choice(lowercase)

    longer = randint(shorter, 12) # domain longer

    dn = ''

    for j in range(longer):

        dn += choice(lowercase)


    print '%s::%s@%s.%s::%d-%d-%d' % (dtstr, em,dn, choice(doms), dtint, shorter, longer)


匹配一个字符串:


你可能感兴趣的:(chapter15 正则表达式)