正则表达式:删除字符串中可以包含其他句点的最后一个句点(挖掘输出)

2023-12-05

我正在尝试解析linux的输出dig使用正则表达式一次命令并执行多项操作。

假设我喜欢主机mail.yahoo.com:

/usr/bin/dig +nocomments +noquestion \
    +noauthority +noadditional +nostats +nocmd \
    mail.yahoo.com A

该命令输出:

mail.yahoo.com.                   0  IN  CNAME  login.yahoo.com.
login.yahoo.com.                  0  IN  CNAME  ats.login.lgg1.b.yahoo.com.
ats.login.lgg1.b.yahoo.com.       0  IN  CNAME  ats.member.g02.yahoodns.net.
ats.member.g02.yahoodns.net.      0  IN  CNAME  any-ats.member.a02.yahoodns.net.
any-ats.member.a02.yahoodns.net. 12  IN  A      98.139.21.169

我想要的是找到所有<host>, <record_type> and <resolved_name>仅使用一个正则表达式没有最后一个句点的部分

对于这个特定的例子mail.yahoo.com,那就是:

[
    ('mail.yahoo.com', 'CNAME', 'login.yahoo.com'),
    ('login.yahoo.com', 'CNAME', 'ats.login.lgg1.b.yahoo.com'),
    ('ats.login.lgg1.b.yahoo.com', 'CNAME', 'ats.member.g02.yahoodns.net'),
    ('ats.member.g02.yahoodns.net', 'CNAME', 'any-ats.member.a02.yahoodns.net'),
    ('any-ats.member.a02.yahoodns.net', 'A', '98.139.21.169'),
]

但事实证明dig命令可能会在名称末尾显示句点:

    mail.yahoo.com. 
        ^     ^   ^
        |     |   |
  Good dot    |   |
              |   |
        Good dot  |
                  |
           (!) Baaaad dot

做一个分裂的正则表达式dig的输出并返回带有最后句点的名称相当简单:

regex = re.compile("^(\S+).+IN\s+([A-Z]+)\s+(\S+)\.*\s*$",re.MULTILINE)

但打电话.findall使用该正则表达式确实会返回主机中的最后一个句点,因为\S+也将匹配最后一个周期:

[
    ('mail.yahoo.com.', 'CNAME', 'login.yahoo.com.'),
    ('login.yahoo.com.', 'CNAME', 'ats.login.lgg1.b.yahoo.com.'),
    ('ats.login.lgg1.b.yahoo.com.', 'CNAME', 'ats.member.g02.yahoodns.net.'),
    ('ats.member.g02.yahoodns.net.', 'CNAME', 'any-ats.member.a02.yahoodns.net.'),
    ('any-ats.member.a02.yahoodns.net.', 'A', '98.139.21.169'),
]

所以我需要某物匹配所有非空格\S除非它是句点后跟空格。

我进行了无数次的尝试,但一直未能想出一个像样的解决方案。

先感谢您!

PS:我知道我总是可以使用“简单”正则表达式,并(在第二遍中)删除找到的字符串的最后一个点,但我很好奇是否可以使用正则表达式一次性完成此操作。


您可以简单地强制组末尾没有句点(并且不包含空格):

npg = '([^\.\s]+(?:.[^\.\s]+)*)' #not_period_ending_group
regex = re.compile("^" + npg + ".+IN\s+([A-Z]+)\s+" + npg +".+$",re.MULTILINE)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式:删除字符串中可以包含其他句点的最后一个句点(挖掘输出) 的相关文章

随机推荐