使用正则表达式删除字符串中的重复单词

时间:2018-09-21 12:32:05

标签: python regex

我正在研究我的正则表达式技能,我发现我的字符串之一开头有重复的单词。我想删除重复项,只说一个字-

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

2 个答案:

答案 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组的内容被串联起来并组成结果值。

Python demo

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