2016-10-07 66 views
1

如果測試成功,如何在Pythonic方式下編寫多個正則表達式模式以測試並提取匹配的組?編寫多個正則表達式測試的Pythonic方式

也就是說,以下代碼片段的Pythonic相當於什麼?

if re.match(pattern1, string): 
    m = re.match(pattern1, string) 
    grps = m.groups() 
    ...[process matched groups for pattern1]... 
elif re.match(pattern2, string): 
    m = re.match(pattern2, string) 
    grps = m.groups() 
    ...[process matched groups for pattern2]... 
elif re.match(pattern3, string): 
    m = re.match(pattern3, string) 
    grps = m.groups() 
    ...[process matched groups for pattern3]... 
+0

這些正則表達式模式有多複雜?你可以將它們合併爲一個正則表達式。或者將它們放入列表(或元組)並在列表中循環可能會更容易。 –

回答

0

基本上我想要的是:

m = re.match(pattern1, string) 
if m: 
    grps = m.groups() 
    print(pattern1) 
else: 
    m = re.match(pattern2, string) 
    if m: 
     grps = m.groups() 
     print(pattern2) 

這是我已經找到了最好的風格,模仿case聲明存在於許多語言:

while True: 
    m = re.match(pattern1, string) 
    if m: 
     grps = m.groups() 
     print(pattern1) 
     break 
    m = re.match(pattern2, string) 
    if m: 
     grps = m.groups() 
     print(pattern2) 
     break 

不確定我是Python中的case的發明人。但從文本中我們可以看到第二個縮進,而第一個是線性縮進。算法教授告訴我們O(1)O(n)好。

3
patterns = [pattern1, pattern2, pattern3] 
for pattern in patterns: 
    m = re.match(pattern, string) 
    if m: 
     grps = m.groups() 
     ... 
     break 
+0

不同的模式需要以不同的方式進行處理。因此,如果......其他......嵌套在聲明的更深層次中,將會有額外的內容。不知道這是Pythonic。 – Cyker

0

使一個功能,用於處理該得到的基團各自圖案。然後你可以使用列表理解:

lst = [(pattern1, func1), (p2, f2)...] 
results = [func(match.groups()) for (match, func) in [(re.match(patt, theStr), func) for (patt, func) in lst] if match]