【问题标题】:Match a word that doesn't contain a dot and isn't an IP regex匹配不包含点且不是 IP 正则表达式的单词
【发布时间】:2021-09-13 07:28:54
【问题描述】:

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

我希望它能够包含数字和字符,例如 - _ * 等等,除了 . 之外的任何字符。

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

【问题讨论】:

标签: python regex dns


【解决方案1】:

您可以将此正则表达式与 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 正在使用您提供的正则表达式。第 3 组是 (?P&lt;sub&gt;[^\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']

【讨论】:

  • 我会将该模式放在一个非捕获组中并重复 3 次。然后调用match.groupdict() 将显示所有捕获。
  • 如何将它添加到 python 脚本中?我想要一个域、ips 和子域的列表。 Atm 我只是将 findall 与我提供的 2 个正则表达式一起使用,并将它们放入列表中
  • 请使用re.finditer并将每个组分别存储在3个单独的列表中
猜你喜欢
  • 2016-01-14
  • 2017-02-06
  • 1970-01-01
  • 2022-12-11
相关资源
最近更新 更多