【问题标题】:python regex doesn't match dig outputpython 正则表达式与挖掘输出不匹配
【发布时间】:2013-12-29 07:16:49
【问题描述】:

我正在尝试解析一些 dig 输出(是的,我知道 dnspython,但它不满足我的要求)并且在为我的用例找到匹配的正则表达式时遇到了问题。 我试图从 dig 输出中找到所有带有 IN 和 NS 的行,示例输出如下所示:

stackexchange.com.  300 IN  NS  ns1.serverfault.com.
stackexchange.com.  300 IN  NS  ns2.serverfault.com.

我试过了:

if 'NS' in line:

我发现了一些相关的行,遗憾的是我对 NSEC DNS 条目有一些误报,例如:

CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q5NFFJS5FUB0F2DNA098SBN0O663V NS SOA RRSIG DNSKEY NSEC3PARAM

也出现在我的输出中。 我知道\s 转义应该匹配任何类型的空格和制表符,但是我的正则表达式失败了。我目前有

for line in output:
    regex = re.compile(r'IN\sNS\s')
    if regex.match(line):
        print(line)

但它不起作用。你能帮我想出一个不会产生误报的正则表达式吗? 任何形式的帮助表示赞赏。 提前致谢

【问题讨论】:

    标签: python regex dns dig


    【解决方案1】:

    你想要search,而不是match

    match command only matches from the beginning of the string

    此外,如果INNS 之间的空白数量是灵活的,您可以使用+ 量化一个或多个匹配项。

    如果您将正则表达式的编译移出循环并且只编译一次,您的代码会更快:

    regex = re.compile(r'IN\s+NS\s')
    for line in output:
        if regex.search(line):
            print(line)
    

    【讨论】:

    • 谢谢!这非常有效。我会在 10 分钟内将此标记为已回答,因为 SO 不允许我将其标记为已回答。
    【解决方案2】:

    你需要写\s*

    \s 只匹配一个空格字符,并且您有多个空格或可能需要匹配的制表符

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多