RegEx搜索忽略字符串中的单词

时间:2015-07-20 06:05:27

标签: regex python-2.7

我有一个包含数千个服务器名称条目的文件,但我想忽略任何服务器,如下所示:

bnn6122.fdw.dee.corp;
ao.d33fegd.ao.dee.corp;
ao.d55fegd.ao.dee.corp;
qrwafgwd00846.fdw.dee.corp;
kdgf9934.wdf.dee.corp

他们的数字值不同但字符保持不变。

我尝试了以下代码,但它返回一个空白列表:

re.findall(r'^(?!bnn[0-9]|^ao*|^qrwafgwd[0-9]|^kdgf[0-9])\w+(.wdf.dee.corp)', f, re.M|re.I)

如果我忽略上面的服务器,我仍然应该在列表中获得大约3000台服务器。我做错了什么?

2 个答案:

答案 0 :(得分:1)

你需要在开始时使用负面预测:

^(?!(?:bnn\d+\.fdw|ao\.d\d+fegd\.ao|qrwafgwd\d+\.fdw|kdgf\d+\.wdf)\.dee\.corp)

请参阅demo

^锚点从字符串的开头开始搜索(如果您需要从一行的开头搜索,请使用re.M),然后(?!...)前瞻将确保在开头就没有出现交替组中的子串。共同部分 - dee.corp - 不属于小组,因为它是一个共同的结尾。

请注意,ao.d33fegd.ao.dee.corpao.d55fegd.ao.dee.corp遵循相同的模式,因此可以进一步缩短正则表达式。

答案 1 :(得分:1)

^(?!(?:bnn[0-9]|ao.*|qrwafgwd[0-9]|kdgf[0-9]))\w+(?:\.wdf\.dee\.corp)

试试这个。参见demo.Escape .

https://regex101.com/r/hF7zZ1/1