python的正则表达式re模块

1850阅读 0评论2015-05-20 qidunhu
分类:Python/Ruby

    Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,在文本解析、复杂字符串分析和信息提取时是一个非常有用的工具,下面我主要总结了re的常用方法。

1.re的简介
    使用python的re模块,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息。python 会将正则表达式转化为字节码,利用 C 语言的匹配引擎进行深度优先的匹配。
  1. import re
  2. print re.__doc__
    可以查询re模块的功能信息,下面会结合几个例子说明。

2.re的正则表达式语法
    正则表达式语法表如下:
语法 意义 说明
"." 任意字符
"^" 字符串开始 '^hello'匹配'helloworld'而不匹配'aaaahellobbb'
"$" 字符串结尾 与上同理
"*" 
0 个或多个字符(贪婪匹配)
<*>匹配chinaunix
"+"
1 个或多个字符(贪婪匹配
与上同理
"?"
0 个或多个字符(贪婪匹配
与上同理
*?,+?,??
以上三个取第一个匹配结果(非贪婪匹配 <*>匹配</span><br /> </td> </tr> <tr> <td> <span style="font-size:14px;">{m,n}</span><br /> </td> <td> <span style="font-size:14px;">对于前一个字符重复m到n次,{m}亦可</span><br /> </td> <td> <span style="font-size:14px;">a{6}匹配6个a、a{2,4</span><span style="font-size:14px;">}匹配2到4个a</span> </td> </tr> <tr> <td> <span style="font-size:14px;">{m,n}?</span><br /> </td> <td> <span style="white-space:normal;font-size:14px;">对于前一个字符重复m到n次,并取尽可能少</span><span style="font-size:14px;"></span><br /> </td> <td> <span style="font-size:14px;">‘aaaaaa</span><span style="font-size:14px;">’中a{2,4}只会匹配2个</span> </td> </tr> <tr> <td> <span style="font-size:14px;">"\\"</span><br /> </td> <td> <span style="font-size:14px;">特殊字符转义或者特殊序列</span> </td> <td> <br /> </td> </tr> <tr> <td> <span style="font-size:14px;">[]</span><br /> </td> <td> <span style="font-size:14px;">表示一个字符集</span> </td> <td> <span style="font-size:14px;">[0-9]、[a-z</span><span style="font-size:14px;">]、[A-Z</span><span style="font-size:14px;">]、[^0]</span> </td> </tr> <tr> <td> <span style="font-size:14px;">"|"</span><br /> </td> <td> <span style="font-size:14px;">或</span> </td> <td> <span style="font-size:14px;">A|B,或运算</span> </td> </tr> <tr> <td> <span style="font-size:14px;">(...)</span><br /> </td> <td> <span style="font-size:14px;">匹配括号中任意表达式</span> </td> <td> <br /> </td> </tr> <tr> <td> <span style="font-size:14px;">(?#...)</span><br /> </td> <td> <span style="font-size:14px;">注释,可忽略</span> </td> <td> <br /> </td> </tr> <tr> <td> <span style="font-size:14px;">(?=...)</span><br /> </td> <td> <span style="font-size:14px;">Matches if ... matches next, but doesn't consume the string.</span><span style="font-size:14px;"></span><br /> </td> <td> <span style="font-size:14px;">'(?=test)'  </span><span style="font-size:14px;">在hellotest中匹配hello</span> </td> </tr> <tr> <td> <span style="font-size:14px;">(?!...)</span><br /> </td> <td> <span style="font-size:14px;">Matches if ... doesn't match next.</span><span style="font-size:14px;"></span><br /> </td> <td> <span style="white-space:normal;font-size:14px;">'(?!=test)'</span><span style="font-size:14px;">  </span><span style="font-size:14px;">若hello后面不为test,匹配hello</span><br /> </td> </tr> <tr> <td> <span style="font-size:14px;">(?<=...) </span><br /> </td> <td> <span style="font-size:14px;">Matches if preceded by ... (must be fixed length).</span><span style="font-size:14px;"></span><br /> </td> <td> <span style="white-space:normal;"><span style="font-size:14px;">'(?<=hello</span><span style="font-size:14px;">)test'  </span></span><span style="font-size:14px;">在hellotest中匹配test</span><br /> </td> </tr> <tr> <td> <span style="font-size:14px;">(?<!...)</span><br /> </td> <td> <span style="font-size:14px;">Matches if not preceded by ... (must be fixed length).</span><span style="font-size:14px;"></span><br /> </td> <td> <span style="white-space:normal;font-size:14px;">'(?<!hello)</span><span style="font-size:14px;">test'  在hellotest中不匹配test</span><br /> </td> </tr> </tbody> </table> <span style="font-size:16px;">    正则表达式特殊序列表如下:</span><br /> <table style="width:60%;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000"> <tbody> <tr> <td> <span style="white-space:normal;font-size:14px;">特殊序列符号</span><br /> </td> <td> <span style="font-size:14px;">意义</span> </td> </tr> <tr> <td> <span style="font-size:14px;">\A</span><br /> </td> <td> <span style="font-size:14px;">只在字符串开始进行匹配</span> </td> </tr> <tr> <td> <span style="font-size:14px;">\Z</span><br /> </td> <td> <span style="font-size:14px;">只在字符串结尾进行匹配</span> </td> </tr> <tr> <td> <span style="font-size:14px;">\b</span><br /> </td> <td> <span style="font-size:14px;">匹配位于开始或结尾的空字符串</span> </td> </tr> <tr> <td> <span style="font-size:14px;">\B</span><br /> </td> <td> <span style="font-size:14px;">匹配不位于开始或结尾的空字符串</span> </td> </tr> <tr> <td> <span style="font-size:14px;">\d</span><br /> </td> <td> <span style="font-size:14px;">相当于[0-9]</span> </td> </tr> <tr> <td> <span style="font-size:14px;">\D</span><br /> </td> <td> <span style="font-size:14px;">相当于[^0-9]</span> </td> </tr> <tr> <td> <span style="font-size:14px;">\s</span><br /> </td> <td> <span style="font-size:14px;">匹配任意空白字符:[\t\n\r\r\v]</span> </td> </tr> <tr> <td> <span style="font-size:14px;">\S</span><br /> </td> <td> <span style="font-size:14px;">匹配任意非空白字符:</span><span style="white-space:normal;font-size:14px;">[^\t\n\r\r\v</span><span style="white-space:normal;font-size:14px;">]</span> </td> </tr> <tr> <td> <span style="font-size:14px;">\w</span><br /> </td> <td> <span style="font-size:14px;">匹配任意数字和字母:[a-zA-Z0-9]</span> </td> </tr> <tr> <td> <span style="font-size:14px;">\W</span><br /> </td> <td> <span style="font-size:14px;">匹配任意非数字和字母:[^a-zA-Z0-9]</span> </td> </tr> </tbody> </table> <br /> <br /> <span style="font-size:18px;"><strong>3.re的主要功能函数</strong></span><br /> <span style="font-size:16px;">    常用的功能函数包括:compile、search、match、split、findall(finditer)、sub(subn)<br /> <strong>compile</strong><br /> re.compile(pattern[, flags])<br /> 作用:把正则表达式语法转化成正则表达式对象<br /> flags定义包括:<br /> re.I:忽略大小写<br /> re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境<br /> re.M:多行模式<br /> re.S:’ . ’并且包括换行符在内的任意字符(注意:’ . ’不包括换行符)<br /> re.U: 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库<br /> <br /> <strong>search</strong><br /> re.search(pattern, string[, flags])<br /> <span style="font-size:16px;line-height:24px;white-space:normal;">search (string[, pos[, endpos]])</span><br /> 作用:在字符串中查找匹配正则表达式模式的位置,返回 MatchObject 的实例,如果没有找到匹配的位置,则返回 None。<br /> <br /> <strong>match</strong><br /> re.match(pattern, string[, flags])<br /> <span style="font-size:16px;line-height:24px;white-space:normal;">match(string[, pos[, endpos]])</span><br /> 作用:match() 函数只在字符串的开始位置尝试匹配正则表达式,也就是只报告从位置 0 开始的匹配情况,而 search() 函数是扫描整个字符串来查找匹配。如果想要搜索整个字符串来寻找匹配,应当用 search()。<br /> <br /> 下面是几个例子:<br /> 例:最基本的用法,通过<span style="font-size:16px;line-height:24px;white-space:normal;">re.RegexObject对象调用</span><span style="font-size:16px;line-height:24px;white-space:normal;"></span><br /> <div id="codeText" class="codeText"> <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"> <li> <span style="color:#000000;">#<span style="color:#0000CC;">!</span><span style="color:#0000CC;">/</span>usr<span style="color:#0000CC;">/</span>bin<span style="color:#0000CC;">/</span>env python<br /> </span> </li> <li> <span style="color:#0000FF;">import</span> re<br /> </li> <li> <br /> </li> <li> r1 <span style="color:#0000CC;">=</span> re<span style="color:#0000CC;">.</span>compile<span style="color:#0000CC;">(</span>r<span style="color:#FF00FF;">'world'</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">if</span> r1<span style="color:#0000CC;">.</span>match<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'helloworld'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">:</span><br /> </li> <li>     <span style="color:#0000FF;">print</span> <span style="color:#FF00FF;">'match succeeds'</span><br /> </li> <li> <span style="color:#0000FF;">else</span><span style="color:#0000CC;">:</span><br /> </li> <li>     <span style="color:#0000FF;">print</span> <span style="color:#FF00FF;">'match fails'</span><br /> </li> <li> <br /> </li> <li> <span style="color:#0000FF;">if</span> r1<span style="color:#0000CC;">.</span>search<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'helloworld'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">:</span><br /> </li> <li>     <span style="color:#0000FF;">print</span> <span style="color:#FF00FF;">'search succeeds'</span><br /> </li> <li> <span style="color:#0000FF;">else</span><span style="color:#0000CC;">:</span><br /> </li> <li>     <span style="color:#0000FF;">print</span> <span style="color:#FF00FF;">'search fails'</span> </li> </ol> </div> 说明一下:<span style="font-size:16px;line-height:24px;white-space:normal;">r是raw(原始)的意思。因为在表示字符串中有一些转义符,如表示回车'\n'。如果要表示\表需要写为'\\'。但如果我就是需要表示一个'\'+'n',不用r方式要写为:</span><span style="font-size:16px;line-height:24px;white-space:normal;">'\\n'。但使用r方式则为r'\n'这样清晰多了。</span><br /> <br /> 例:设置flag<br /> <div id="codeText" class="codeText"> <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"> <li> <span style="color:#000000;">#r2 <span style="color:#0000CC;">=</span> re<span style="color:#0000CC;">.</span>compile<span style="color:#0000CC;">(</span>r<span style="color:#FF00FF;">'n$'</span><span style="color:#0000CC;">,</span> re<span style="color:#0000CC;">.</span>S<span style="color:#0000CC;">)</span><br /> </span> </li> <li> #r2 <span style="color:#0000CC;">=</span> re<span style="color:#0000CC;">.</span>compile<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'\n$'</span><span style="color:#0000CC;">,</span> re<span style="color:#0000CC;">.</span>S<span style="color:#0000CC;">)</span><br /> </li> <li> r2 <span style="color:#0000CC;">=</span> re<span style="color:#0000CC;">.</span>compile<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'World$'</span><span style="color:#0000CC;">,</span> re<span style="color:#0000CC;">.</span>I<span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">if</span> r2<span style="color:#0000CC;">.</span>search<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'helloworld\n'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">:</span><br /> </li> <li>     <span style="color:#0000FF;">print</span> <span style="color:#FF00FF;">'search succeeds'</span><br /> </li> <li> <span style="color:#0000FF;">else</span><span style="color:#0000CC;">:</span><br /> </li> <li>     <span style="color:#0000FF;">print</span> <span style="color:#FF00FF;">'search fails'</span> </li> <li> <span style="color:#FF00FF;"><br /> </span> </li> </ol> </div> 例:直接调用<br /> <div id="codeText" class="codeText"> <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"> <li> <span style="color:#000000;"><span style="color:#0000FF;">if</span> re<span style="color:#0000CC;">.</span>search<span style="color:#0000CC;">(</span>r<span style="color:#FF00FF;">'abc'</span><span style="color:#0000CC;">,</span><span style="color:#FF00FF;">'helloaaabcdworldn'</span><span style="color:#0000CC;">)</span><span style="color:#0000CC;">:</span><br /> </span> </li> <li>     <span style="color:#0000FF;">print</span> <span style="color:#FF00FF;">'search succeeds'</span><br /> </li> <li> <span style="color:#0000FF;">else</span><span style="color:#0000CC;">:</span><br /> </li> <li>     <span style="color:#0000FF;">print</span> <span style="color:#FF00FF;">'search fails'</span> </li> </ol> </div> <strong>split</strong><br /> re.split(pattern, string[, maxsplit=0, flags=0])<br /> split(string[, maxsplit=0])<br /> 作用:可以将字符串匹配正则表达式的部分割开并返回一个列表<br /> 例:简单分析ip<br /> <div id="codeText" class="codeText"> <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"> <li> <span style="color:#000000;">#<span style="color:#0000CC;">!</span><span style="color:#0000CC;">/</span>usr<span style="color:#0000CC;">/</span>bin<span style="color:#0000CC;">/</span>env python<br /> </span> </li> <li> <span style="color:#0000FF;">import</span> re<br /> </li> <li> r1 <span style="color:#0000CC;">=</span> re<span style="color:#0000CC;">.</span>compile<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'W+'</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">print</span> r1<span style="color:#0000CC;">.</span>split<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'192.168.1.1'</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">print</span> re<span style="color:#0000CC;">.</span>split<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'(W+)'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'192.168.1.1'</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">print</span> re<span style="color:#0000CC;">.</span>split<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'(W+)'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'192.168.1.1'</span><span style="color:#0000CC;">,</span> 1<span style="color:#0000CC;">)</span> </li> </ol> </div> 结果如下:<br /> ['192', '168', '1', '1']<br /> ['192', '.', '168', '.', '1', '.', '1']<br /> ['192', '.', '168.1.1']<br /> <div style="white-space:nowrap;"> <span style="line-height:1.5;"></span> </div> <strong>findall</strong><br /> re.findall(pattern, string[, flags])<br /> findall(string[, pos[, endpos]])<br /> 作用:在字符串中找到正则表达式所匹配的所有子串,并组成一个列表返回<br /> 例:查找[]包括的内容(贪婪和非贪婪查找)<br /> <div id="codeText" class="codeText"> <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"> <li> <span style="color:#000000;">#<span style="color:#0000CC;">!</span><span style="color:#0000CC;">/</span>usr<span style="color:#0000CC;">/</span>bin<span style="color:#0000CC;">/</span>env python<br /> </span> </li> <li> <span style="color:#0000FF;">import</span> re<br /> </li> <li> <br /> </li> <li> r1 <span style="color:#0000CC;">=</span> re<span style="color:#0000CC;">.</span>compile<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'([.*])'</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">print</span> re<span style="color:#0000CC;">.</span>findall<span style="color:#0000CC;">(</span>r1<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">"hello[hi]heldfsdsf[iwonder]lo"</span><span style="color:#0000CC;">)</span><br /> </li> <li> r1 <span style="color:#0000CC;">=</span> re<span style="color:#0000CC;">.</span>compile<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'([.*?])'</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">print</span> re<span style="color:#0000CC;">.</span>findall<span style="color:#0000CC;">(</span>r1<span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">"hello[hi]heldfsdsf[iwonder]lo"</span><span style="color:#0000CC;">)</span><br /> </li> <li> <br /> </li> <li> <span style="color:#0000FF;">print</span> re<span style="color:#0000CC;">.</span>findall<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'[0-9]{2}'</span><span style="color:#0000CC;">,</span><span style="color:#FF00FF;">"fdskfj1323jfkdj"</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">print</span> re<span style="color:#0000CC;">.</span>findall<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'([0-9][a-z])'</span><span style="color:#0000CC;">,</span><span style="color:#FF00FF;">"fdskfj1323jfkdj"</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">print</span> re<span style="color:#0000CC;">.</span>findall<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'(?=www)'</span><span style="color:#0000CC;">,</span><span style="color:#FF00FF;">"afdsfwwwfkdjfsdfsdwww"</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">print</span> re<span style="color:#0000CC;">.</span>findall<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'(?<=www)'</span><span style="color:#0000CC;">,</span><span style="color:#FF00FF;">"afdsfwwwfkdjfsdfsdwww"</span><span style="color:#0000CC;">)</span> </li> </ol> </div> <br /> finditer<br /> re.finditer(pattern, string[, flags])<br /> <span style="font-size:16px;line-height:24px;white-space:normal;">finditer(string[, pos[, endpos]])</span><br /> 说明:和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并组成一个迭代器返回。同样 RegexObject 有:<br /> <br /> <strong>sub</strong><br /> re.sub(pattern, repl, string[, count, flags])<br /> <span style="font-size:16px;line-height:24px;white-space:normal;">sub(repl, string[, count=0])</span><br /> 说明:在字符串 string 中找到匹配正则表达式 pattern 的所有子串,用另一个字符串 repl 进行替换。如果没有找到匹配 pattern 的串,则返回未被修改的 string。Repl 既可以是字符串也可以是一个函数。<br /> 例:<br /> <div id="codeText" class="codeText"> <ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"> <li> <span style="color:#000000;">#<span style="color:#0000CC;">!</span><span style="color:#0000CC;">/</span>usr<span style="color:#0000CC;">/</span>bin<span style="color:#0000CC;">/</span>env python<br /> </span> </li> <li> <span style="color:#0000FF;">import</span> re<br /> </li> <li> <br /> </li> <li> p <span style="color:#0000CC;">=</span> re<span style="color:#0000CC;">.</span>compile<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'(one|two|three)'</span><span style="color:#0000CC;">)</span><br /> </li> <li> <span style="color:#0000FF;">print</span> p<span style="color:#0000CC;">.</span>sub<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">'num'</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">'one word two words three words apple'</span><span style="color:#0000CC;">,</span> 2<span style="color:#0000CC;">)</span> </li> </ol> </div> <br /> subn<br /> re.subn(pattern, repl, string[, count, flags])<br /> <span style="font-size:16px;line-height:24px;white-space:normal;">subn(repl, string[, count=0])</span><br /> 说明:该函数的功能和 sub() 相同,但它还返回新的字符串以及替换的次数。同样 RegexObject 有:<br /> <br /> </span> </div> <div class="page">上一篇:<a href="/uid-24404943-id-4974273.html">python实现冒泡排序和插入排序算法</a><br> 下一篇:<a href="/uid-24404943-id-5064517.html">优化linux内核参数</a></div> <footer> <a href="http://blog.itpub.net/">ITPUB博客</a> | <a href="http://www.itpub.net">ITPUB论坛</a> | <a href="http://bbs.chinaunix.net/">chinaunix论坛</a><br> 北京皓辰网域网络信息技术有限公司. 版权所有 </footer> <script> $(function(){ $("#fenlei").click(function(){ $("#left_1").show(); $("#left_2").show(); }); }) </script> </body> </html> <script language="javascript" src="http://stat.it168.com/pv.js"></script> <script> function sendPV(){ var pvTrack = new PvTrack(); pvTrack.type = 35; // 频道类别ID pvTrack.channel = 531; // 频道ID pvTrack.pageType = 0; pvTrack.track(); } window.setTimeout("sendPV()", 1000); </script>