Python正则表达式匹配所有但最后一次出现

时间:2013-04-24 22:31:24

标签: regex python-2.7 directory

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

3 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:0)

不使用正则表达式,而使用str.countstr.replace

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

答案 2 :(得分:0)

特定的一字符式解决方案

在当前情况下,您可以使用

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

在这里,\.(?![^.]*$).匹配的\.(没有紧随(?!...)后面)与.以外的任何0+字符(请参见[^.]*)直到字符串($)的末尾。

请参见regex demoPython demo

1个字符以上的通用解决方案

如果您要替换. 字符,则可以在字符类周围使用一个捕获组,并将其与您需要匹配的字符相匹配,并使用{ {1}}和对捕获值的反向引用。

说,您需要删除最后一次出现的.*[]^\/或{ {1}}您可以使用

-

请参见regex demo

详细信息

  • .-与([][^\\./-])(?=.*\1) ([][^\\./-])][^\,{ {1}}(请注意,这些字符的顺序很重要:.必须在结尾,/必须在开头,-不应在开头,{{ 1}}必须转义)
  • --一个积极的前瞻,需要尽可能多的0+个字符,然后在组1中捕获该值。

Python sample code

]

用字符串文字记住^前缀。请注意,\将使(?=.*\1)与任何换行序列匹配。