python - 匹配不包含点且不是 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)。
我希望它能够有数字和字符- _ *
之类的,除了.
.
我怎样才能通过正则表达式做到这一点?
解决方案
您可以将此正则表达式与 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.]+)
命名组domain
并ip
使用您提供的正则表达式。第 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']