【发布时间】: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(或版本字段为空白的任何地方)。
我的最后一个.* 似乎不应该越过行终止符,但确实如此。我还在最后一个捕获组之后包含了?,以尝试使其成为可选,例如允许空值。
谁能指出我做错了什么?解释我的错误比仅仅为我提供一个有效的正则表达式会更有帮助。
【问题讨论】:
-
你使用的是什么正则表达式引擎?
-
Python 的 re 库。然而,这个问题也适用于 regex101.com 上的解析器,所以我认为这是我的表达而不是实现缺陷。
-
@BenF:这与“实施缺陷”无关,而是不同的引擎以不同的方式实现正则表达式。例如,JavaScript 没有后视,非魔法 Vim 需要转义
+而不是*,Ruby 有递归模式,Perl 有一堆黑魔法......甚至在 regex 标签中:“自从正则表达式还没有完全标准化,所有带有这个标签的问题还应该包含一个标签,指定适用的编程语言或工具。”
标签: python regex capture-group