【问题标题】:Python regex positive lookbehindPython 正则表达式正面向后看
【发布时间】:2021-10-26 10:50:24
【问题描述】:

我有一些多行文本,每次运行我的 python 程序时都会发生变化。我想搜索搜索模式的出现,然后向后查找以:object-group network

开头的第一行

示例文本(可能有几千行):

object-group network CISCO_ROUTER
 network-object host 1.1.1.1
 network-object object NCPVGW03_10.1.1.2
 network-object object NCPVGW04_10.1.1.3
 network-object object SGAVGW01_10.2.2.2
 network-object object NPLVGW02_10.1.6.2
 network-object object NCPVGW02_10.1.1.3
 network-object object C1121-8P_FGL2418L267_10.8.8.1
 network-object object NDEVGW01_10.6.4.2
 network-object object HD999901_192.168.0.3
 network-object object ISR4321-FDO21172C94_10.8.8.2
 network-object object DMRVGW02_10.1.1.4
object-group network CISCO_SWITCH
 network-object host 1.1.1.1
 network-object object HD138203_10.198.80.3
 network-object object HD165103_10.5.0.1
 network-object object HD166207_10.5.1.7
 network-object object HD134402_10.194.176.102
 network-object object HD137602_10.196.176.102
 network-object object HD131603_10.192.240.103
 network-object object HD134104_10.194.128.104
 network-object object HD166503_10.53.192.103
 network-object object HD165510_10.53.64.110
 network-object object HD202001_10.33.48.30
 network-object object HD132706_10.193.160.106
 network-object object HD700041_10.88.64.141

我想找到:network-object object HD700041_10.88.64.141,然后当我向后看时,object-group network 的第一次出现。

我尝试了这种正则表达式搜索模式:(object-group network.+)[\w\W]+?(?<=HD700041_10\.88\.64\.141)

但结果是:object-group network CISCO_ROUTER

我如何在向后看时找到第一个出现的object-group network CISCO_SWITCH

【问题讨论】:

  • 如果您已经确切地知道它的样子并且您刚刚确认它在那里(即使正则表达式没有产生它),为什么要返回它?
  • 我需要对象组名称进行进一步处理。
  • 如果出于某种原因,您绝对需要正则表达式来产生值,为什么不直接匹配字符串本身,然后提前查找后续值?跨度>
  • 我需要搜索一个对象并查看它是否存在,然后生成该对象所属的组。
  • 啊,你需要 'CISCO_ROUTER',明白了 - 仍然,第二条评论有意义吗?为什么不使用前瞻,或者只使用匹配两个部分的表达式而不使用前瞻/后置?

标签: python regex


【解决方案1】:

你可以使用

(?m)^(object-group network.*)(?:\n(?!object-group).*)*\n.*HD700041_10\.88\.64\.141

请参阅regex demo详情

  • (?m)^ - 行首
  • (object-group network.*) - 第 1 组:以 object-group network 开头的行
  • (?:\n(?!object-group).*)* - 零个或多个不以 object-group 字符串开头的行
  • \n - 换行
  • .*HD700041_10\.88\.64\.141 - 除换行符之外的任何零个或多个字符,尽可能多,然后是 HD700041_10.88.64.141 文本。

注意,末尾的141 也可能匹配141000 中的141。如果要专门匹配141值,请在末尾添加(?!\d)

【讨论】:

    猜你喜欢
    • 2018-03-07
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多