天天看點

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