2011-10-03 101 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