我有以下模式(每个示例都在不同的文件中):
example one
-----------
alpha: 192.168.50.0 - 192.168.50.24
delta: 192.168.50.100 - 192.168.50.124
other fields: more stuff
....
example two
-------------
gamma: 200.0.0.0 - 200.0.0.64
lamda: 200.0.0.124 - 200.0.0.255
other fields: more stuff
....
我正在使用Python对这些文件进行编译,并试图找到一个只匹配'alpha'
或'gamma'
的一行程序,并且只匹配范围内的第二个ip。因此,在我们的示例中,它将是:192.168.50.24
或200.0.0.64
类似的东西,这将给给予我只有第二个ip:
(?<=alpha:\s)|(?<=gamma:\s).*
4条答案
按热度按时间u5rb5r591#
每当处理IP地址时,我总是依靠优秀的
ipaddress
库,因为它很容易进行有效性检查(使用更简单的正则表达式并尝试一下),比较方法(网络中的ip?),支持IPv4和IPv6,了解特殊范围(global、link_local、multicast..)-此外,您可以考虑使用自定义类来管理这些范围如果您最终想要 * 完整 * 范围,并且正在通过查找第二个范围来解决它,那么像这样的东西可能会更清楚地得到您想要的内容,并且对构建有用
(note可以在脚本中匹配
if instance.label:
)示例使用
咀嚼多条线
还可以看看
ipaddress.summarize_address_range(start, end)
,它可能是一个有用的迭代器(__iter__
方法?)也是ubbxdtey2#
在您尝试的模式中,
.*
仅适用于交替|
的第二部分但是,如果你只通过分组查找来解决交替的问题,使用
.*
仍然可以匹配该行的其余部分,而不仅仅是第二个ip。由于在示例数据中似乎有不同数量的前导空格,您可以考虑对第二个IP使用捕获组,同时匹配第一个IP及其前面的空格。
这是一个缩短的模式,用于捕获示例数据中的部分。如果你想要一个更好的匹配ip的字符串,你可以看到How to Find or Validate an IP Address。
模式匹配:
\b
防止部分字匹配的字边界(?:alpha|gamma):
匹配alpha:
或gamma:
\s+\d[\d.]+
匹配1+空格字符、数字和1+数字或点\s+-\s+
匹配1+个空格字符之间的连字符(\d[\d.]+)
捕获组1,匹配数字后跟1+数字或点参见regex demo
hts6caw33#
你可以把它转换成一本字典,没有太多的麻烦,直接指出你想要的任何东西。即使这是4行实际的字符串操作,它可能仍然比正则表达式更有效。
这样做的一个好处是,你可以在你走的时候投值(如果这是你需要的)。这样,
dict
不仅拥有所有值,而且它们都是正确的类型。我在你发布的例子中没有看到任何可以从中受益的东西,但是也许你在other_fields
部分有一堆布尔值,浮点数或整型数。然后,您可以将所有这些内容组合在一起,添加一些动态元素,最后得到一个小的whack-a-mole解析器,它可以处理所有这些具有分离键:值对的非格式
guz6ccqo4#
Alpha 192.168.50.24
gamma 200.0.0.64