【问题标题】:Regular expression to get last separator character before certain pattern正则表达式获取特定模式之前的最后一个分隔符
【发布时间】:2012-11-03 16:45:03
【问题描述】:

获取某个模式前最后一个分隔符位置的正则表达式是什么?

比如我有一个字符串如下

some value;some other value;some special XYZ value;some more special XYZ value

这里,分隔符是分号(“;”),我正在寻找的模式是任何包含“XYZ”的字符串。

正确答案是这种情况是位置 28,它是在包含匹配模式(“XYZ”)的元素之前最后出现的分隔符(“;”)。

正则表达式是什么样的?

【问题讨论】:

    标签: regex


    【解决方案1】:
    ;(?=[^;]*XYZ)
    

    匹配字符串同一段中后跟XYZ 的分号。

    使用一次来查找第一个匹配项。如果你反复使用它,你也会发现以下几种情况。

    【讨论】:

      【解决方案2】:

      使用这个正则表达式

      ^.*(;).*XYZ.*$
      

      .*(;).*XYZ.* 会贪婪地匹配,即它会匹配到最后一次出现 ; 且后面跟着 XYZ

      【讨论】:

      • 那个表达式没有得到第一个XYZ,而是第二个。
      • @Howard 是操作要求的,即最后一次出现 ;跟随 XYZ
      • 并非如此。 OP 说第 28 位的分号应该匹配。不过,这个问题措辞不清楚。
      • @TimPietzcker:正确,我正在寻找匹配模式 (XYZ) 之前(即之前)分隔符的最后一次出现。在给出的示例中是第 28 位。
      【解决方案3】:

      您可以分两步完成:

      • 提取包含第一次出现的 XYZ 且前面有分隔符的最大子字符串
      • 在该子字符串中找到最后一个分隔符的位置

      即,

      s = "some value;some other value;some special XYZ value;some more special XYZ value"
      s1 = re.findall("^.*?;.*?XYZ",s)[0]
      len(re.findall("(.*;)",s1)[0]) --> 28
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-04
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-29
        • 1970-01-01
        相关资源
        最近更新 更多