13

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

4

3 回答 3

20

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

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

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

于 2013-04-24T22:43:27.087 回答
1

没有正则表达式,使用str.countand str.replace

s = "./folder/thisisa.test/file.cxx.h" 
s.replace('.', '', s.count('.')-1)
# '/folder/thisisatest/filecxx.h'
于 2019-06-16T13:57:51.520 回答
0

具体的一字符解决方案

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

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

在这里,将不紧跟 ( ) 的(with ) 与除(see )之外的任何 0+ 字符\.(?![^.]*$)匹配到字符串 ( ) 的末尾。.\.(?!...).[^.]*$

请参阅正则表达式演示Python 演示

1+ 字符的通用解决方案

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

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

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

请参阅正则表达式演示

细节

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

Python 示例代码

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.匹配任何换行符序列。

于 2019-10-04T07:52:09.607 回答