首页 > 解决方案 > 匹配不包含点且不是 IP 正则表达式的单词

问题描述

我想获取一个列表并对其进行过滤(在这种情况下,它是一个记录、一个域名和一个 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)。

我希望它能够有数字和字符- _ *之类的,除了..

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

标签: pythonregexdns

解决方案


您可以将此正则表达式与 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.]+)

正则表达式演示

命名组domainip使用您提供的正则表达式。第 3 组是(?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']

推荐阅读