我有一个表达式,例如"./folder/thisisa.test/file.cxx.h",如何替换或删除除最后一个点以外的所有点?
我有一个表达式,例如"./folder/thisisa.test/file.cxx.h",如何替换或删除除最后一个点以外的所有点?
使用 str.count
和 str.replace
,无需正则表达式:
最初的回答:
s = "./folder/thisisa.test/file.cxx.h"
s.replace('.', '', s.count('.')-1)
# '/folder/thisisatest/filecxx.h'
具体的单字符解决方案
在您目前的情况下,您可以使用
text = re.sub(r'\.(?![^.]*$)', '', text)
\.(?![^.]*$)
可以匹配一个带有\.
的.
,它不是紧随着((?!...)
)除了.
以外的任何0个或多个字符(参见[^.]*
),一直到字符串结尾($
)。.
并且还要替换更多字符,可以使用一个围绕需要匹配的字符和一个正向先行断言.*
及对捕获值的反向引用的字符类捕获组。[
,]
,^
,\
,/
,-
或.
,您可以使用([][^\\./-])(?=.*\1)
查看正则表达式演示。
细节
([][^\\./-])
- 一个捕获组,匹配]
、[
、^
、\
、.
、/
、-
(注意这些字符的顺序很重要:-
必须在最后,]
必须在开头,^
不应该在开头,\
必须转义)(?=.*\1)
- 正向先行断言,需要任意0+个字符尽可能多地匹配,然后是捕获组1中捕获的值。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
将使.
匹配任何换行符序列。
os.path
。 - Felipe