2013-01-17 53 views
2

正則表達式專家請幫忙!我有以下兩個例子:正則表達式:搜索幾個可能的組

'(JEN) This is a sentence.' 
'This is another sentence (412).' 

我試圖提取下列方式這兩個句子的不同可能要素(明知有三種可能的元素類型):

['JEN', 'This is a sentence', None] 
[None, 'This is another sentence', 412] 

不任何人都知道如何解決這個問題?

我嘗試以下的正則表達式:

r'(\(([A-Z]{3})\))?\s*([\w- ]+)?\s*(\(([0-9]{3})\))?' 
r'(?:\(([A-Z]{3})\)\s*)(?:([\w- ]+))(?:\(([0-9]{3})\))' # Passive Groups 

而對於這兩個我得到無效的正則表達式錯誤。

任何想法爲什麼?

回答

2

sre_constants.error: bad character range發生是因爲[\w- ]被解釋爲一個範圍。可以使用[\w -],但通常-應該在字符類內部轉義:[\w\- ]

此外,您的表達式不等同(除分組外)。我不確定這是否是故意的,但請注意,(regex)?的非捕獲版本是(?:regex)?,而不是(?:regex)。爲了表現類似於第一個表達式,第二個應該是:

r'(?:\(([A-Z]{3})\))?\s*([\w\- ]+)?\s*(?:\(([0-9]{3})\))?' 
+1

'[\ w-]'在Python,Ruby,...中無效,但它在PCRE中是有效的(匹配詞,'-'和空格)。 (儘管你的解釋沒有錯誤)。而「未命名」在術語上有點偏離,應該是非捕獲組。 – nhahtdh

+0

感謝您的更正。 PCRE提及+1;我不知道這是有效的。 –

+0

是的,我的兩次嘗試都是故意不同的。我嘗試了你的建議,它也返回了一個錯誤。我正在使用http://www.regexplanet.com/advanced/python/index.html進行測試。 – zanbri

0

就個人而言,我會說只是捕獲實際的括號您的組裏面,你知道,得到的組1的捕捉和3將他們,所以你可以適應,正則表達式肯定是更好。

此外,在這種情況下的'句子'可能更好地定義爲'任何東西,但是一個正確的括號'。這就是說,這適用於所有的輸入:

r'(\([A-Z]{3}\))?\s*([^(]+)(\(\d{3}\))?'