2012-05-17 100 views
2

我需要re模塊的幫助。我有模式:Python:正則表達式:查找是否存在,否則忽略

pattern = re.compile('''first_condition\((.*)\) 
extra_condition\((.*)\) 
testing\((.*)\) 
other\((.*)\)''', re.UNICODE) 

那會發生什麼,如果我運行下面的文字正則表達式:

text = '''first_condition(enabled) 
extra_condition(disabled) 
testing(example) 
other(something)''' 
result = pattern.findall(text) 
print(result) 
[('enabled', 'disabled', 'example', 'something')] 

但是如果一個或兩行被遺漏,正則表達式返回空列表。例如。我的文字是:

text = '''first_condition(enabled) 
other(other)''' 

我要得到什麼:

[('enabled', '', '', 'something')] 

我可以在幾個命令做到這一點,但我認爲,這將是比一個正則表達式做慢。原始代碼使用sed,所以速度非常快。我可以用sed來做,但我需要跨平臺的方式來做到這一點。有可能嗎? Tnanks!

P.S.這也將是巨大的,如果字符串的順序將是免費的,不是固定不變的:

text = '''other(other) 
first_condition(enabled)''' 

必須返回絕對是一樣的:

[('enabled', '', '', 'something')] 
+2

你真的想要得到的結果是包含一個元組的列表? –

+0

@MarkByers:不,單個列表甚至更好。 – ghostmansd

+0

或單個元組,不需要。 – ghostmansd

回答

4

我將它解析到詞典第一:

import re 

keys = ['first_condition', 'extra_condition', 'testing', 'other'] 
d = dict(re.findall(r'^(.*)\((.*)\)$', text, re.M)) 
result = [d.get(key, '') for key in keys] 

看到它聯機工作:ideone

+2

'd = dict(re.findall(r'^(。*)\((。*)\)$',text,re.M))'對於dict的創建來說會更乾淨。另外,如果值包含空格'text.split()'應該改爲'text.split('\ n')'。 –

+0

@StevenRumbalski:謝謝,這有點乾淨。 –

+0

這是一個非常明確的答案。謝謝! – ghostmansd

0

使用可選的東西不匹配的組,使組在羣組後面加一個問號是可選的。

例子:

pat = re.compile(r'a\(([^)]+)\)(?:b\((?P<bgr>[^)]+)\)?') 

很抱歉,但我現在不能測試此權利。

以上需要像a(foo)字符串,並以父母抓起文本組0

然後可選的字符串匹配像b(foo),如果匹配將被保存爲名稱的命名組:bgr

請注意,我沒有使用.*來匹配parens內部,而是使用[^)]+。當它到達關閉的paren時,它肯定會停止匹配,並且至少需要一個字符。如果父親可以爲空,則可以使用[^)]*

這些模式變得越來越複雜,因此您可能需要在註釋中使用詳細模式。

要有幾個可能以任意順序出現的可選模式,請將它們全部放在不匹配的組中,並用豎線分隔它們。您將需要使用指定的匹配組,因爲您不知道該訂單。在非匹配組之後加星號,以允許存在任意數量的替代模式(如果不存在則包括零)。