2014-10-20 57 views
0

我有一個正則表達式,看起來像:提取名稱和正則表達式的跨度匹配組

rgx = '(?P<foo>ABC)(?P<bar>DEF)?(?P<norf>HIJK)' 

獲得匹配的字符串是沒有問題的m.group(name)。但是,我需要提取名稱範圍的匹配組(甚至只是名稱的跨度),並沒有找到一種方法來做到這一點。我想這樣做:

p = re.compile(p, re.IGNORECASE) 
m = p.match(targetstring) 
#then do something to set 'all' to the list of match objects 
for mo in all 
    print mo.name() + '->' + mo.span() 

因此,例如,輸入字符串「ABCDEFHIJK」應該產生的輸出:

'foo' -> (0, 3) 
'bar' -> (3, 6) 
'norf' -> (6, 10) 

謝謝!

+0

是什麼'span'? – laike9m 2014-10-20 12:06:30

+0

發佈一個示例以及預期的輸出。 – 2014-10-20 12:07:24

+0

@ laike9m span是屬於正則表達式MatchObject的一種方法。它告訴字符串的哪一部分是匹配的。 – Colin 2014-10-20 12:17:44

回答

3

您遍歷匹配組的名稱(中groupdict鍵)並打印相應的span屬性:

rgx = '(?P<foo>ABC)(?P<bar>DEF)?(?P<norf>HIJK)' 
p = re.compile(rgx, re.IGNORECASE) 
m = re.match(p, 'ABCDEFHIJKLM') 

for key in m.groupdict(): 
    print key, m.span(key) 

此打印:

foo (0, 3) 
bar (3, 6) 
norf (6, 10) 

編輯:由於密鑰的字典是無序的,你可能希望明確地選擇密鑰迭代的順序。在下面的例子中,sorted(...)是相應的字典值排序的組名的列表(span元組):

for key in sorted(m.groupdict().keys(), key=m.groupdict().get): 
    print key, m.span(key) 
+0

您的代碼不會打印結果。 – georg 2014-10-20 12:27:15

+0

@georg糟糕。修正了錯字。謝謝! – 2014-10-20 12:28:20

+0

這樣更好,但仍然沒有雪茄。 'groupdict'是一個字典,所以結果的順序是不能保證的。 – georg 2014-10-20 12:29:11

2

您可以使用RegexObject.groupindex

p = re.compile(rgx, re.IGNORECASE) 
m = p.match('ABCDEFHIJK') 

for name, n in sorted(m.re.groupindex.items(), key=lambda x: x[1]): 
    print name, m.group(n), m.span(n)