方世玉的姐 發表於 2017-5-12 19:11:00

python3的正则表达式(regex)

<p><br>&nbsp;&nbsp;&nbsp; 正则表达式提供了一种紧凑的表示法,可用于表示字符串的组合,一个单独的正则表达式可以表示无限数量的字符串。常用的5种用途:分析、搜索、搜索与替代、字符串的分割、验证。</p>
<p><br>(一)正则表达式语言<br>python中特殊字符有&nbsp;&nbsp; &nbsp;\.^$?+*{}[]()|<br>1、字符类速记<br>^   如果在字符类中第一个字符则表示否定;<br>-  &nbsp; 表示一个字符范围,如果作为字符类中的第一个字符,就表示一个字面意义上的连字符;<br>.    可以匹配除换行符之外的任意字符,或带re.DOTALL标记的任意字符,或匹配字符类内部的字面意义的字符;<br>\d  &nbsp; 匹配一个Unicode数字,或带re.ASCII标记的;<br>\D  匹配一个Unicode非数字,或带re.ASCII标记的[^0-9];<br>\s   匹配Unicode空白,或带re.ASCII标记的[\t\n\r\f\v];<br>\S   匹配Unicode非空白,或带re.ASCII标记的[^\t\n\r\f\v];<br>\w   匹配一个Unicode单词字符,或带re.ASCII标记的;<br>\W   匹配一个Unicode非单词字符,或带re.ASCII标记的[^a-zA-Z0-9_]</p>
<p><br>2、量词<br>格式{m,n},m与n分别表示使用该量词的表达必须匹配的最少次数与最多次数。如果只给定一个数字则同时表示最小值最大值<br>量词速记形式:<br>e{m}&nbsp;&nbsp; &nbsp;  准确匹配表达式e的m次出现<br>e{m,}&nbsp;&nbsp;   贪婪地匹配表达式e至少m次出现<br>e{m,}?&nbsp;&nbsp; &nbsp; 非贪婪地匹配表达式e至少m次出现<br>e{,n}&nbsp;&nbsp; &nbsp;  最多n次出现<br>e{,n}?&nbsp;&nbsp; &nbsp;  非贪婪<br>e?&nbsp;&nbsp; &nbsp;   &nbsp; e{0,1}<br>e??&nbsp;&nbsp; &nbsp;   e{0,1}?<br>e+&nbsp;&nbsp; &nbsp;  &nbsp;&nbsp;&nbsp; e{1,}<br>e+?&nbsp;&nbsp; &nbsp;   e{1,}?<br>e*&nbsp;&nbsp; &nbsp;    e{0,}<br>e*?&nbsp;&nbsp; &nbsp;  &nbsp; e{0,}?<br>[]&nbsp;&nbsp; &nbsp;   &nbsp; 匹配[]内的任意一个内容<br>()&nbsp;&nbsp; &nbsp;   将()的内容作为一个整体来进行匹配<br>贪婪表示会尽可以多的匹配符合条件的字符,非贪婪则为尽可以少的匹配。</p>
<p><br>3、可用air(craft|plane)来匹配 aircraft和airplane。<br>使用air(?:craft|plane)可以用来限制当处于更多的嵌套中时,aricraft和airplane只有一次捕获。圆括号表示组。</p>
<p><br>4、\i反向引用,i表示前面的捕获号。捕获号也可以用在左圆括号前加 ?P&lt;name&gt;来用名称代替<br>如:(?P&lt;key&gt;\w+)=(?P&lt;value&gt;.+)对于捕获进行反向引用(?P=name): (?P&lt;word&gt;\w+)\s+(?P=word) 可以使用名为"word"的捕获来匹配重复的单词。</p>
<p><br>5、正则表达式断言:<br>^ &nbsp;&nbsp; &nbsp;在起始处匹配,也可以在带MULTILINE标记的每个换行符后匹配;<br>$&nbsp;&nbsp; &nbsp;&nbsp; 在结尾处匹配,也可以在带MULTILINE标记的每个换行符前匹配;<br>\A &nbsp;&nbsp; &nbsp;在起始处匹配;<br>\b&nbsp;&nbsp; &nbsp;在单词边界匹配,受re.ASCII影响,如果在字符内部则是backspace的转义字符;<br>\B&nbsp;&nbsp; &nbsp;在非单词边界匹配,受re.ASCII影响;<br>\Z&nbsp;&nbsp; &nbsp;在结尾处匹配;<br>(?=e)&nbsp;&nbsp; &nbsp;如果表达式e在此断言处匹配,但没有超出此处——称为前瞻或正前瞻,则匹配;<br>(?!e)&nbsp;&nbsp; &nbsp;如果表达式e在此断言处不匹配,但没有超出此处——称为负前瞻,则匹配;<br>(?&lt;=e)&nbsp;&nbsp; &nbsp;如果表达式e恰在本断言之前匹配——称为正回顾,则匹配;<br>(?&lt;!e)&nbsp;&nbsp; &nbsp;如果表达式e恰在本断言之前不匹配——称为负回顾,则匹配;</p>
<p><br>6、正则表达式的注释<br>可用(?#the comment)来实现,也可用re.VERBOSE标记。&nbsp;</p>
<p><br>(二)正则表达式模块<br>正则表达式模块标记:<br>re.A 或 re.ASCII <br>re.I 或 re.IGNORECASE&nbsp;&nbsp; &nbsp;忽略大小写<br>re.M 或 re.MULTILINE&nbsp;&nbsp; &nbsp;使^在起始处并在每个换行符后匹配,使$在结尾处但在每个换行符之前匹配<br>re.S 或 re.DOTALL&nbsp;&nbsp; &nbsp;使.匹配每个字符,包括换行符<br>re.X 或 re.VERBOSE&nbsp;&nbsp; &nbsp;使空白与注释包含在匹配中<br><br>正则表达式模块的函数(供查):<br>re.compile(r,f)&nbsp;&nbsp; &nbsp;返回编译后的正则表达式r,如果指定,就将其标记设置为f(即上边的re.A等,且可同时有多个标记,用|分隔);(使用re'regex'的形式表达字符串可不用转义)<br>re.escape(s)&nbsp;&nbsp; &nbsp; &nbsp; 返回字符串s,其中所有非字母数字的字符都使用反斜线进行了转义处理,因此,返回的字符串中没有特殊的正则表达式字符;<br>re.findall(r,s,f)&nbsp;&nbsp;&nbsp; 返回正则表达式r在字符串s中所有非交叠的匹配(如果给定f,就受其制约)。如果正则表达式中有捕获,那么每次匹配都作为一个捕获元组返回;<br>re.finditer(r,s,f) &nbsp; 对正则表达式r在字符串s中每个非交叠的匹配(如果给定了f,就受其制约),都返回一个匹配对象;<br>re.match(r,s,f)&nbsp;&nbsp; &nbsp;如果正则表达式r在字符串s的起始处匹配(如果给定f,就受其制约),就返回一个匹配对象(MatchObject),否则返回None;<br>re.search(r,s,f)&nbsp;&nbsp; 如果正则表达式r在字符串s的任意位置匹配(如果给定f,就受其制约),就返回一个匹配对象,否则返回None;<br>re.split(r,s,m)&nbsp;&nbsp; &nbsp; 返回分割字符串s(在正则表达式r每次出现处进行分割)所产生的字符串的列表,至多分割m次(如果没有给定m,就尽可能多的分割),如果正则表达式中包含捕获,就被包含在分割的部分之间;<br>re.sub(r,x,s,m)&nbsp;&nbsp; &nbsp;对正则表达式r的每次匹配(如果给定m,那么至多m次),返回字符串s的一个副本,并将其替换为x--这可以是一个字符串,也可以是一个函数;<br>re.subn(r,x,s,m) 与re.sub()函数相同,区别在于此函数返回一个二元组;<br><br>匹配对象属性与方法:<br>m.end(g)&nbsp;&nbsp;   &nbsp;返回组g(如果给定)在文本匹配的终点索引位置,对组0,则表示整体匹配;如果匹配中不包含该组,就返回-1;<br>m.endpos&nbsp;&nbsp;   &nbsp;搜索的终点索引位置<br>m.expands(s)&nbsp;&nbsp; &nbsp;返回字符串s,并将其中捕获标识用相应的捕获替代;<br>m.group(g,...)&nbsp;&nbsp; 返回编号的或命名的组g,如果给定的不止一个,就返回相应的捕获组成的元组;<br>m.groupdict(difault) 返回一个字典,其中存放所有命名的捕获组,组名作为键,捕获作为值;如果给定了default参数,就将其用作那些不参与匹配的捕获组的值;<br>m.groups(default) 返回包含所有捕获的元组,从1开始;如果给定default,就将其用作那此不参与匹配的捕获组的值;<br>m.lastgroup&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 匹配的、编号最高的捕获组的名称,如果不存在或没有使用名称,就返回None;<br>m.lastindex&nbsp;&nbsp; &nbsp;  匹配的、编号最高的捕获组的编号,如果没有就返回None;<br>m.pos&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;  &nbsp; 搜索的起始索引位置;<br>m.re&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;  &nbsp;&nbsp; 产生这一匹配对象的正则表达式对象;<br>m.span(g)&nbsp;&nbsp; &nbsp;  如果给定g,就返回组g在文本中匹配的起始索引位置与结尾位置;(对组0,则是整体匹配);如果该组不参与匹配,就返回(-1,-1);<br>m.start(g)&nbsp;&nbsp;   &nbsp;如果给定g,就返回组g在文本中匹配的起始索引位置(对组0,则是整体匹配);如果该组不参加匹配,就返回-1;<br>m.string&nbsp;&nbsp;   &nbsp;&nbsp; 传递给match()或search()的字符串;</p>
<p>&nbsp;</p>
<p>7、其他</p>
<p>(1)前后匹配边界,但不匹配边界</p>
<p>如:aa5646a22cc,匹配aa和cc之间的内容:(?&lt;=aa).*(?=cc)</p>
<p>(2)匹配内容中不包含指定内容</p>
<p>如:maybe shell while, 匹配不包含字母a的单词:((?!a)\w)+</p><br><br>
来源:https://www.cnblogs.com/aland-1415/p/6846949.html
頁: [1]
查看完整版本: python3的正则表达式(regex)