匹配一个不包含点且不是 IP 正则表达式的单词

Match a word that doesn't contain a dot and isn't an IP regex

我想获取一个列表并对其进行过滤(在本例中,它是一个包含记录、域名和 ip 的列表)。 我希望列表是这样的:

10.0.0.10 ansible0 ben1.com  
ansible1 ben1.com  10.0.0.10

也就是说,您可以将 ip 区域和记录放在任何地方,它仍然会捕获它们。

现在我得到了 2 个正则表达式,一个捕获域(带点)和 IP:

域:[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}

简单 IP:(?:[0-9]{1,3}\.){3}[0-9]{1,3}

有了这些,我可以抓取 python 所有域名并将它们放入列表和所有 ips。

现在我只需要捕获“子域”(在本例中为 ansible1 和 ansible0)。

我希望它能够包含数字和字符,例如 - _ * 等等,除了 ..

我怎样才能通过正则表达式做到这一点?

您可以将此正则表达式与 3 个交替和 3 个命名组一起使用:

(?P<domain>[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,})|
(?P<ip>(?:[0-9]{1,3}\.){3}[0-9]{1,3})|
(?P<sub>[^\s.]+)

RegEx Demo

命名组 domainip 正在使用您提供的正则表达式。第三组是 (?P<sub>[^\s.]+) 匹配 1+ 个不是点也不是空格的字符。


代码:

import re

arr = ['10.0.0.10 ansible0 ben1.com', 'ansible1 ben1.com  10.0.0.10']

rx = re.compile(r'(?P<domain>[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,})|(?P<ip>(?:[0-9]{1,3}\.){3}[0-9]{1,3})|(?P<sub>[^\s.]+)')

subs = []
for i in arr:
     for m in rx.finditer(i):
             if (m.group('sub')): subs.append(m.group('sub'))

print (subs)

输出:

['ansible0', 'ansible1']