如何修复此正则表达式?(nmap结果)

2024-03-29 11:13:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的正则表达式是:

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

一些示例输入是:

^{pr2}$

这几乎是完美的。问题出在135/udp的行上,没有version字段,因此我对该行的捕获组4正在环绕并捕获下一行的整个内容(从137/udp开始)。在

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

似乎我的最后一个.*不应该经过行结束符,但它确实是。我还将?包含在上一个捕获组之后,以尝试使其成为可选的,如允许空值。在

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

Visual representation


Tags: 文本版本示例内容version地方错误open
2条回答

\s似乎与换行符匹配。这对我来说是意外的-我本以为\s只匹配空白。在

只尝试匹配制表符和空格: [ \t]而不是{}。在

而且要求更高一点-这意味着设置使用+而不是*的空格和非空格:

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

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

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

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

最正确的是,我将/s的所有实例替换为与预期间隔字符匹配的显式匹配:

^{pr2}$

相关问题 更多 >