天天看點

Python正規表達式指南中半部

re提供了衆多子產品方法用于完成正規表達式的功能。這些方法可以使用Pattern執行個體的相應方法替代,唯一的好處是少寫一行re.compile()代碼,但同時也無法複用編譯後的Pattern對象。這些方法将在Pattern類的執行個體方法部分一起介紹。如上面這個例子可以簡寫為:

1

2

<code>m</code><code>=</code> <code>re.match(r</code><code>'hello'</code><code>,</code><code>'hello world!'</code><code>)</code>

<code>print</code> <code>m.group()</code>

  re子產品還提供了一個方法escape(string),用于将string中的正規表達式元字元如*/+/?等之前加上轉義符再傳回,在需要大量比對元字元時有那麼一點用。

  Match對象是一次比對的結果,包含了很多關于此次比對的資訊,可以使用Match提供的可讀屬性或方法來擷取這些資訊。

  屬性:

string: 比對時使用的文本。

re: 比對時使用的Pattern對象。

pos: 文本中正規表達式開始搜尋的索引。值與Pattern.match()和Pattern.seach()方法的同名參數相同。

endpos: 文本中正規表達式結束搜尋的索引。值與Pattern.match()和Pattern.seach()方法的同名參數相同。

lastindex: 最後一個被捕獲的分組在文本中的索引。如果沒有被捕獲的分組,将為None。

lastgroup: 最後一個被捕獲的分組的别名。如果這個分組沒有别名或者沒有被捕獲的分組,将為None。

  方法:

group([group1, …]): 

獲得一個或多個分組截獲的字元串;指定多個參數時将以元組形式傳回。group1可以使用編号也可以使用别名;編号0代表整個比對的子串;不填寫參數時,傳回group(0);沒有截獲字元串的組傳回None;截獲了多次的組傳回最後一次截獲的子串。

groups([default]):

以元組形式傳回全部分組截獲的字元串。相當于調用group(1,2,…last)。default表示沒有截獲字元串的組以這個值替代,預設為None。

groupdict([default]):

傳回以有别名的組的别名為鍵、以該組截獲的子串為值的字典,沒有别名的組不包含在内。default含義同上。

start([group]):

傳回指定的組截獲的子串在string中的起始索引(子串第一個字元的索引)。group預設值為0。

end([group]):

傳回指定的組截獲的子串在string中的結束索引(子串最後一個字元的索引+1)。group預設值為0。

span([group]):

傳回(start(group), end(group))。

expand(template):

将比對到的分組代入template中然後傳回。template中可以使用\id或\g&lt;id&gt;、\g&lt;name&gt;引用分組,但不能使用編号0。\id與\g&lt;id&gt;是等價的;但\10将被認為是第10個分組,如果你想表達\1之後是字元’0′,隻能使用\g&lt;1&gt;0。

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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

<code>m</code><code>=</code> <code>re.match(r</code><code>'(\w+) (\w+)(?P&lt;sign&gt;.*)'</code><code>,</code><code>'hello world!'</code><code>)</code>

<code>print</code> <code>"m.string:"</code><code>, m.string</code>

<code>print</code> <code>"m.re:"</code><code>, m.re</code>

<code>print</code> <code>"m.pos:"</code><code>, m.pos</code>

<code>print</code> <code>"m.endpos:"</code><code>, m.endpos</code>

<code>print</code> <code>"m.lastindex:"</code><code>, m.lastindex</code>

<code>print</code> <code>"m.lastgroup:"</code><code>, m.lastgroup</code>

<code>print</code> <code>"m.group(1,2):"</code><code>, m.group(</code><code>1</code><code>,</code><code>2</code><code>)</code>

<code>print</code> <code>"m.groups():"</code><code>, m.groups()</code>

<code>print</code> <code>"m.groupdict():"</code><code>, m.groupdict()</code>

<code>print</code> <code>"m.start(2):"</code><code>, m.start(</code><code>2</code><code>)</code>

<code>print</code> <code>"m.end(2):"</code><code>, m.end(</code><code>2</code><code>)</code>

<code>print</code> <code>"m.span(2):"</code><code>, m.span(</code><code>2</code><code>)</code>

<code>print</code> <code>r</code><code>"m.expand(r'\2 \1\3'):"</code><code>, m.expand(r</code><code>'\2 \1\3'</code><code>)</code>

<code>### output ###</code>

<code># m.string: hello world!</code>

<code># m.re: &lt;_sre.SRE_Pattern object at 0x016E1A38&gt;</code>

<code># m.pos: 0</code>

<code># m.endpos: 12</code>

<code># m.lastindex: 3</code>

<code># m.lastgroup: sign</code>

<code># m.group(1,2): ('hello', 'world')</code>

<code># m.groups(): ('hello', 'world', '!')</code>

<code># m.groupdict(): {'sign': '!'}</code>

<code># m.start(2): 6</code>

<code># m.end(2): 11</code>

<code># m.span(2): (6, 11)</code>

<code># m.expand(r'\2 \1\3'): world hello!</code>

  Pattern對象是一個編譯好的正規表達式,通過Pattern提供的一系列方法可以對文本進行比對查找。

  Pattern不能直接執行個體化,必須使用re.compile()進行構造。

  Pattern提供了幾個可讀屬性用于擷取表達式的相關資訊:

pattern: 編譯時用的表達式字元串。

flags: 編譯時用的比對模式。數字形式。

groups: 表達式中分組的數量。

groupindex: 以表達式中有别名的組的别名為鍵、以該組對應的編号為值的字典,沒有别名的組不包含在内。

<code>p</code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>'(\w+) (\w+)(?P&lt;sign&gt;.*)'</code><code>, re.DOTALL)</code>

<code>print</code> <code>"p.pattern:"</code><code>, p.pattern</code>

<code>print</code> <code>"p.flags:"</code><code>, p.flags</code>

<code>print</code> <code>"p.groups:"</code><code>, p.groups</code>

<code>print</code> <code>"p.groupindex:"</code><code>, p.groupindex</code>

<code># p.pattern: (\w+) (\w+)(?P&lt;sign&gt;.*)</code>

<code># p.flags: 16</code>

<code># p.groups: 3</code>

<code># p.groupindex: {'sign': 3}</code>

  執行個體方法[ | re子產品方法]:

  1.match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]):

  這個方法将從string的pos下标處起嘗試比對pattern;如果pattern結束時仍可比對,則傳回一個Match對象;如果比對過程中pattern無法比對,或者比對未結束就已到達endpos,則傳回None。

  pos和endpos的預設值分别為0和len(string);re.match()無法指定這兩個參數,參數flags用于編譯pattern時指定比對模式。

  注意:這個方法并不是完全比對。當pattern結束時若string還有剩餘字元,仍然視為成功。想要完全比對,可以在表達式末尾加上邊界比對符’$'。

  示例參見2.1小節。

本文轉自 風雨蕭條 51CTO部落格,原文連結:http://blog.51cto.com/1095221645/1607791,如需轉載請自行聯系原作者