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<id>、\g<name>引用分組,但不能使用編号0。\id與\g<id>是等價的;但\10将被認為是第10個分組,如果你想表達\1之後是字元’0′,隻能使用\g<1>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<sign>.*)'</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: <_sre.SRE_Pattern object at 0x016E1A38></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<sign>.*)'</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<sign>.*)</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,如需轉載請自行聯系原作者