我有一个包含数千个服务器名称条目的文件,但我想忽略任何服务器,如下所示:
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台服务器。我做错了什么?
答案 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.corp
和ao.d55fegd.ao.dee.corp
遵循相同的模式,因此可以进一步缩短正则表达式。
答案 1 :(得分:1)
^(?!(?:bnn[0-9]|ao.*|qrwafgwd[0-9]|kdgf[0-9]))\w+(?:\.wdf\.dee\.corp)
试试这个。参见demo.Escape .
。