我正在研究我的正则表达式技能,我发现我的字符串之一开头有重复的单词。我想删除重复项,只说一个字-
server_server_dev1_check_1233.zzz
server_server_qa1_run_1233.xyz
server_server_dev2_1233.qqa
server_dev1_1233.zzz
data_data_dev9_check_660.log
我使用了以下正则表达式,但在输出中同时获得了两个server_server
((.*?))_(?!\D)
如果有两个或多个,如果只有两个server_
,我怎么能只输出到一个server_
呢?
输出不必包含digits
以及.
之后的部分,即.zzz, .xyz
等
预期的输出-
server_dev1_check
server_qa1_run
server_dev2
server_dev1
data_dev9_check
答案 0 :(得分:4)
您可以在搜索表达式中回溯引用该词:
>>> s = "server_server_dev1_check_1233.zzz"
>>> re.sub(r"(.*_)\1",r"\1",s)
'server_dev1_check_1233.zzz'
并使用“多次”后缀,因此,如果出现两次以上,它仍然有效:
'server_server_server_dev1_check_1233.zzz'
>>> re.sub(r"(.*_)\1{1,}",r"\1",s)
'server_dev1_check_1233.zzz'
摆脱后缀不是最困难的部分,只需捕获其余部分并丢弃结尾:
>>> re.sub(r"(.*_)\1{1,}(.*)(_\d+\..*)",r"\1\2",s)
'server_dev1_check'
答案 1 :(得分:3)
您可以使用单个re.sub
调用来匹配并删除不需要的内容,并匹配并捕获所需内容:
re.sub(r'^([^_]+)(?:_\1)*(.*)_\d+\.\w+$', r'\1\2', s)
请参见regex demo
详细信息
^
-字符串的开头([^_]+)
-捕获组1:_
之外的任意1个以上的字符(?:_\1)*
-重复_
零次或更多次,后跟与第1组相同的子字符串(由于内联反向引用 \1
可以检索文本)来自第1组)(.*)
-组2:尽可能多的0个字符以上_
-下划线\d+
-1个以上数字\.
-一个点\w+
-1个以上的字符字符([^.]+
也可以,除了.
以外还可以包含1个或更多字符)$
-字符串的结尾。替换模式为\1\2
,即第1组和第2组的内容被串联起来并组成结果值。
import re
rx = r'^([^_]+)(?:_\1)*(.*)_\d+\.\w+$'
strs = ["server_server_dev1_check_1233.zzz", "server_server_qa1_run_1233.xyz", "server_server_dev2_1233.qqa", "server_dev1_1233.zzz", "data_data_dev9_check_660.log"]
for s in strs:
print(re.sub(rx, r'\1\2', s))
输出:
server_dev1_check
server_qa1_run
server_dev2
server_dev1
data_dev9_check