【问题标题】:Python regex matching all but last occurrencePython 正则表达式匹配除最后一次出现之外的所有内容
【发布时间】:2013-04-18 16:12:49
【问题描述】:

所以我有诸如“./folder/thisisa.test/file.cxx.h”之类的表达式我如何替换/删除所有“。”但最后一个点?

【问题讨论】:

  • 我放的那个更快。不过,你不会看到区别。
  • 使用循环替换它们可能会更快,跟踪最后替换的索引,并在循环之后替换回最后一个点。
  • 如果您正在操作路径名,请查看os.path

标签: regex python-2.7 directory


【解决方案1】:

用正则表达式匹配除最后一个点之外的所有点:

'\.(?=[^.]*\.)'

使用lookahead 检查我们找到的点之后是否还有另一个点(前瞻不是匹配的一部分)。

【讨论】:

    【解决方案2】:

    没有正则表达式,使用str.count和str.replace:

    s = "./folder/thisisa.test/file.cxx.h" 
    s.replace('.', '', s.count('.')-1)
    # '/folder/thisisatest/filecxx.h'
    

    【讨论】:

      【解决方案3】:

      具体的单字符解决方案

      在你的当前场景中,你可以使用

      text = re.sub(r'\.(?![^.]*$)', '', text)
      

      这里,\.(?![^.]*$) 匹配一个 .(带有 \.),该 \. 后面没有紧跟 ((?!...)) 与除 . 之外的任何 0+ 字符(请参阅 [^.]*)直到结尾字符串 ($)。

      请参阅regex demo 和Python demo。

      1+ 字符的通用解决方案

      如果您想替换. 和任何更多字符,您可以在字符类周围使用捕获组以及您需要匹配的字符,并使用.* 添加正向前瞻以及对捕获值的反向引用。

      说,您需要删除最后出现的 [、]、^、\、/、- 或 .,您可以使用

      ([][^\\./-])(?=.*\1)
      

      请参阅regex demo。

      详情

      • ([][^\\./-]) - 匹配]、[、^、\、.、/、- 的捕获组(注意这些字符的顺序很重要:- 必须是最后,] 必须在开头,^ 不应该在开头,\ 必须转义)
      • (?=.*\1) - 正向前瞻,需要尽可能多的 0+ 个字符,然后是第 1 组中捕获的值。

      Python sample code:

      import re
      text = r"./[\folder]/this-is-a.test/fi^le.cxx.LAST[]^\/-.h"
      text = re.sub(r'([][^\\./-])(?=.*\1)', '', text, flags=re.S)
      print(text)
      

      注意带有字符串文字的 r 前缀。请注意flags=re.S 将使. 匹配任何换行序列。

      【讨论】:

      • 2 个明确的解决方案,我看不出他的回答有什么问题。 +1
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2021-05-26
      • 2022-08-21
      相关资源
      最近更新 更多