所以我有诸如“./folder/thisisa.test/file.cxx.h”之类的表达式我如何替换/删除所有“。” 但最后一个点?
问问题
6678 次
3 回答
20
于 2013-04-24T22:43:27.087 回答
1
没有正则表达式,使用str.count
and 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+ 字符\.(?![^.]*$)
匹配到字符串 ( ) 的末尾。.
\.
(?!...)
.
[^.]*
$
1+ 字符的通用解决方案
如果您想替换 a.
和更多字符,您可以在字符类周围使用捕获组,其中包含您需要匹配的字符,并添加正向前瞻.*
和对捕获值的反向引用。
说,您需要删除最后出现的[
, ]
, ^
, \
, /
,-
或者.
您可以使用
([][^\\./-])(?=.*\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
将.
匹配任何换行符序列。
于 2019-10-04T07:52:09.607 回答