天天看点

python3.5里的正则表达式

正则表达式其实内容不多,这是python一个比较人性化的地方,虽然有".","*","?",但是他们单独使用的机会很少,主要的使用是捏合在一起:(.*?)

首先要启动正则表达式,需要先import re。这样才能启动re下面的内部程序。

(.*?)是一个完全精确的算法,她不像“.*”那样贪心,甚至比“.*?”还不贪心。(.*?)使用的格式如下:

re.findall("定位符1(.*?)定位符2",需要检查的字段)

然后就会显示出()内的内容。

for instance:

1

2

3

4

<code>    </code><code>import</code> <code>re</code>

<code>    </code><code>s</code><code>=</code><code>"sdfxxhelloxxfsdfxxworldxxasdf"</code>

<code>    </code><code>d</code><code>=</code><code>re.findall(</code><code>"xx(.*?)xx"</code><code>,s)</code>

<code>    </code><code>print</code><code>(d)</code>

以上的程序显示结果是['hello', 'world'],注意,这是一个列表!即d是可以查序的,d[0]='hello'。

如果s改变一下变成以下的方式:

5

<code>    </code><code>s</code><code>=</code><code>"""sdfxxhello</code>

<code>        </code><code>xxfsdfxxworldxxasdf"""</code>

这样的输出结果是["fsdf"],而不是上一个结果。这是因为“.在默认的情况下不可以匹配转行符/n”。s现在是两段话,那么re.findall会先找第一段,如果在第一段找到了符合要求的会输出,如果没有找到,那么开始在第二段找,但是找归找,却是不继承第一段的内容。所以满足xx~xx之间要求的只有xxfsdfxx这一段,故而输出["fsdf"]。虽然紧跟着后面还有一个xxworldxx,但是由于前面的xx已经被上一段用走了,所以无法再选择了。

如果d=re.findall("xx(.*?)xx",s,re.S),这样的话输出是['hello\n', 'world']。re.S的意思是re模块里的S命令。

连用(.*?):

<code>  </code><code>import</code> <code>re</code>

<code>    </code><code>s</code><code>=</code><code>"89A000Boo2junkiA111Boooo2nium"</code>

<code>    </code><code>d</code><code>=</code><code>re.findall(</code><code>"A(.*?)B(.*?)2"</code><code>,s)</code>

这样的输出结果是[('000', 'oo'), ('111', 'oooo')],d[0]=('000', 'oo'),len(d)=2。

匹配纯数字:

<code>    </code><code>s</code><code>=</code><code>"asdf12345hjkl"</code>

<code>    </code><code>f</code><code>=</code><code>re.findall(</code><code>"(\d+)"</code><code>,s)</code>

<code>    </code><code>print</code><code>(f)</code>

此时的输出结果是12345,f=re.findall("(\d+)",s)的效果等于f=re.findall("asdf(.*?)hjkl",s)。但是要注意(\d+)只能返回纯数字,如果s="asdf12a34w5hjkl"的话,那么再用这条语句,返回的是["12","34","5"]。

search命令

<code>    </code><code>s</code><code>=</code><code>"asdfxxIxx231xxLOVExxDFd"</code>

<code>    </code><code>f</code><code>=</code><code>re.search(</code><code>"xx(.*?)xx213xx(.*?)xx"</code><code>,s).group(</code><code>1</code><code>)</code>

此时的结果是I,若后面改成group(2),那么输出结果是LOVE。可见后面的group号码是对应里面的(.*?)的值,而一旦group号码超出了(.*?)的个数,那么就会红字报错,Index Error.而如果不加group,那么会提示&lt;_sre.SRE_Match object; span=(4, 20), match='xxIxx123xxLOVExx'&gt;。

sub命令

<code>    </code><code>s</code><code>=</code><code>"123RRRRR123"</code>

<code>    </code><code>f</code><code>=</code><code>re.sub("</code><code>123</code><code>(.</code><code>*</code><code>?)</code><code>123</code><code>”,“</code><code>12345</code><code>”,s)</code>

此时输出的结果是12345,可见如果有满足语句选择的量,那么会直接返回sub语句后面的内容。如果没有满足语句选择的量,那么返回的是s。sub主要是一个替换的作用,而无法替换的时候,就将原值返回。

 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1729132