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

2024-05-20 17:33:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我使用了下面的regex,但是我的输出中同时有两个server_server

^{pr2}$

如果有一个或多个cd1,那么如果只有一个,那么它的输出是怎样的? 输出不必包含digits,也不必包含.之后的部分,即.zzz, .xyz

预期输出-

server_dev1_check
server_qa1_run
server_dev2
server_dev1
data_dev9_check

Tags: run字符串datadev1servercheck技能dev2
2条回答

您可以使用一个re.sub调用来匹配和删除不需要的内容,并匹配和捕获所需的内容:

re.sub(r'^([^_]+)(?:_\1)*(.*)_\d+\.\w+$', r'\1\2', s)

参见regex demo

详细信息

  • ^-字符串开头
  • ([^_]+)-捕获组1:除_之外的任何1+字符
  • (?:_\1)*-零次或多次重复_,后跟与组1中相同的子字符串(由于内联backreference\1从组1检索文本)
  • (.*)-组2:任何0+字符,尽可能多
  • _-下划线
  • \d+-1+位数
  • \.-一个点
  • \w+-1+字字符([^.]+也可以,1个或更多个字符而不是.
  • $-字符串结束。在

替换模式是\1\2,也就是说,组1和组2的内容被连接起来,组成结果值。在

Python demo

^{pr2}$

输出:

server_dev1_check
server_qa1_run
server_dev2
server_dev1
data_dev9_check

您可以在搜索表达式中反向引用该词:

>>> s = "server_server_dev1_check_1233.zzz"
>>> re.sub(r"(.*_)\1",r"\1",s)
'server_dev1_check_1233.zzz'

并使用“多次”后缀,这样如果出现2次以上,它仍然有效:

^{pr2}$

去掉后缀并不是最难的部分,只需捕获其余部分并丢弃结尾:

>>> re.sub(r"(.*_)\1{1,}(.*)(_\d+\..*)",r"\1\2",s)
'server_dev1_check'

相关问题 更多 >