2011-10-03 98 views
1

我前面的例子並不清楚,我再舉個例子:Python的正則表達式搜索

a = '123 - 48 <!-- 456 - 251 - --> 452 - 348' 

如果我這樣做:

[el for el in re.split(r' - ',a)] 

我趕上:

['123', '48 <!-- 456', '251', '--> 452', '348'] 

但我想要這個:

['123', '48 <!-- 456 - 251 - --> 452', '348'] 

謝謝...

+0

你這樣做(得到那個結果...),用哪個python版本?從我的經驗來看,el是數組解析中的字符串,而不是使用字典(....) –

+0

Ok @ Update。儘管如此,我認爲使用「過濾器」的非捕獲組是最快的解決方案之一,尤其是對於較長的文本。 (不要忘記挑選答案。) –

回答

5

首先使用這樣的刪除評論:

re.sub("<!--.*?-->", "", your_string) 

然後用你的正則表達式來提取號碼。

您也可以使用?!...(否定性超前斷言),但這不會那麼簡單。

+0

幹得好,保持簡單。 –

0

如果你想要一個正則表達式,你可以使用這樣的:因爲沒有「無效」 -->

(\d+)(?!(?:[^<]+|<(?!!--))*-->) 

只要。

它匹配的數字之後不是-->,沒有<!--之間。

+0

即使對於strlen〜100,它的速度也非常慢(python 2.7)。但它起作用 –

+0

如果它支持原子組或佔有量詞,你可以嘗試'(\ d +)(?!(?:[^ < - ] ++ | <(?!! - )| - (?! - >) )* + - >)' – Qtax

-1

您發佈的結果是re.findall('(\d+)',a);

re.findall('(?:\<\!--.+\d+.+--\>)|(\d+)',a) 

[ '123', '48', '', '452', '348']

filter(None, re.findall('(?:\<\!--.+\d+.+--\>)|(\d+)',a)) 

[ '123', '48','452','348']

+0

'1 - 2 - 3','1 3',幾個例子不起作用。 – Qtax