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的反义:任何非数字符) datad+.txt w 匹配任何数字字母字符,和[A-Za-z0-9]相同(W是w的反义) [A-Za-z_]w+ s 匹配任何空白符,和[ntrf]相同,(S是s的反义) ofsthe b 匹配单词的边界(B是b的反义) bloveb 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"开始的字符串 btheb 仅匹配单词 “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,flags=0) v在字符串string 中查找正则表达式模式pattern 的第 一次出现,flags 是可选标志符,如果匹配成功,则返回一个匹配对 象;否则返回None findall(pattern,string[,flags]) 在字符串string 中查找正则表达式模式pattern 的所有(非重复)出 现;返回一个匹配对象的列表 finditer(pattern,flags]) 和findall()相同,但返回的不是列表而是迭代器;对于每个匹配 ,该迭代器返回一个匹配对象 split(pattern,max=0) 根据正则表达式pattern 中的分隔符把字符string 分割为一个 列表,返回成功匹配的列表,最多分割max 次(默认是分割所有匹 配 的地方)。 sub(pattern,repl,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) 匹配一个字符串: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |