我有一个包含数千个服务器名称条目的文件,但我想忽略任何服务器,如下所示:
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 个服务器。我做错了什么?
最佳答案
您需要在开始时使用否定的前瞻:
^(?!(?:bnn\d+\.fdw|ao\.d\d+fegd\.ao|qrwafgwd\d+\.fdw|kdgf\d+\.wdf)\.dee\.corp)
参见demo
^
anchor 从字符串的开头开始搜索(如果需要从行的开头搜索,请使用 re.M
),然后 (?!...)
前瞻将确保交替组中从一开始就没有出现子字符串。共同部分 - dee.corp
- 不属于该组,因为它是一个共同结局。
请注意,ao.d33fegd.ao.dee.corp
和 ao.d55fegd.ao.dee.corp
遵循相同的模式,因此可以缩短正则表达式更多。
关于正则表达式搜索忽略字符串中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31509745/