【问题标题】:How can I fix this regex? (nmap results)我该如何修复这个正则表达式? (nmap 结果)
【发布时间】:2017-07-10 00:28:43
【问题描述】:

我正在尝试将文本解析为 4 个捕获组,但我遇到了问题。

我的正则表达式是:

(\d{1,5})\/(tcp|udp)\s+open\s+(\S+)\s*(.*)?

一些示例输入是:

Nmap scan report for X
Host is up (0.097s latency).
Not shown: 192 closed ports
PORT     STATE         SERVICE       VERSION
135/udp  open          msrpc
137/udp  open          netbios-ns    Microsoft Windows XP netbios-ssn (workgroup: THINC)
135/tcp open  msrpc        Microsoft Windows RPC
139/tcp open  netbios-ssn  Microsoft Windows netbios-ssn
445/tcp open  microsoft-ds Windows XP microsoft-ds

这几乎可以完美运行。问题在于 135/udp 行,没有版本字段,所以我的捕获组 4 为该行环绕并抓取整个下一行(从 137/udp 开始)。

我希望捕获组 4 对于 135/udp 的行为空/null(或版本字段为空白的任何地方)。

我的最后一个.* 似乎不应该越过行终止符,但确实如此。我还在最后一个捕获组之后包含了?,以尝试使其成为可选,例如允许空值。

谁能指出我做错了什么?解释我的错误比仅仅为我提供一个有效的正则表达式会更有帮助。

Visual representation

【问题讨论】:

  • 你使用的是什么正则表达式引擎?
  • Python 的 re 库。然而,这个问题也适用于 regex101.com 上的解析器,所以我认为这是我的表达而不是实现缺陷。
  • @BenF:这与“实施缺陷”无关,而是不同的引擎以不同的方式实现正则表达式。例如,JavaScript 没有后视,非魔法 Vim 需要转义 + 而不是 *,Ruby 有递归模式,Perl 有一堆黑魔法......甚至在 regex 标签中:“自从正则表达式还没有完全标准化,所有带有这个标签的问题还应该包含一个标签,指定适用的编程语言或工具。”

标签: python regex capture-group


【解决方案1】:

\s 似乎正在匹配换行符。这对我来说是出乎意料的 - 我本来希望 \s 只匹配空格。

尝试仅匹配制表符和空格: [ \t] 而不是 \s

并且要求更高 - 意味着设置+ 所期望的空格和非空格,而不是*

(\d{1,5})\/(tcp|udp)[ \t]+open[ \t]+(\S+)[ \t]+(.*)

(\S+) 是在 open 和空格之后预期的一个条目。 但是因为我们只对之后继续的那些行感兴趣: [ \t]+ 要求在该条目之后有空格(不包括在那里结束的行)-(.*) 捕获空格之后的所有内容。

【讨论】:

  • 谢谢! (\d{1,5})\/(tcp|udp)\s+open\s+(\S+)[ \t]*(.*)?(\d{1,5})\/(tcp|udp)[ \t]+open[ \t]+(\S+)[ \t]*(.*)? 一样工作
  • 已投票,但我还没有足够的声誉来展示它。
  • 我以为您想排除在“msrpc”之后结束的行。为此,您需要最后带有(\S+)[ \t]+(.*) 的版本。
  • 不用担心,很高兴能帮上忙 :)
  • 不过,我相信您应该能够接受答案。您可能需要稍等片刻。
【解决方案2】:

正如 bytepusher 所指出的,我有一个匹配换行符的 \s。我用空格或制表符 [\t] 的显式匹配替换了 \s,如下所示:

(\d{1,5})\/(tcp|udp)\s+open\s+(\S+)[ \t]*(.*)?

最正确的是,我用预期的间距字符的显式匹配替换了所有 /s 实例:

(\d{1,5})\/(tcp|udp)[ \t]+open[ \t]+(\S+)[ \t]*(.*)?

【讨论】:

  • 我认为您可以进一步简单地将正则表达式作为 iirc,大多数 unix/linux 命令通过 \t 分隔字段
  • 我很确定在 Python 中不需要转义 PORT 列值中的斜杠。模式末尾的 ? 也不是必需的,因为最后一个捕获组接受零个或多个字符。 Demo 否则,您可以在不影响准确性的情况下尽可能地使用这种模式。
猜你喜欢
  • 2022-12-21
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 2011-08-08
  • 2021-09-01
  • 1970-01-01
相关资源
最近更新 更多