首页 > 解决方案 > 替换之前出现的单词

问题描述

我想删除括号内的重复单词并将它们替换为“S”+单词。单词可以是任何东西——包括特殊字符、小数、时间段、连字符等。

例如:

(Skipper Skipper) -> (S Skipper)
('s 's) -> (S 's)

这是字符串,s

s = "(S (S (S (S (Skipper Skipper) ('s 's)) (Inc. Inc.)) (S (Bellevue Bellevue) (Wash. Wash.))) 
     (S (said said) (S (it it) (S (signed signed) (S (a a) (S (definitive definitive) 
     (S (merger merger) (S (agreement agreement) (S (for for) (S (S (a a) 
     (S (National National) (S (Pizza Pizza) (S (Corp. Corp.) (unit unit))))) 
     (S (to to) (S (acquire acquire) (S (S (S (the the) (S (90.6 90.6) (% %))) 
     (S (S (of of) (S (S (Skipper Skipper) ('s 's)) (Inc. Inc.))) (S (it it) 
     (S (does does) (S (n't n't) (own own)))))) (S (for for) (S (S (11.50 11.50) 
     (S (a a) (share share))) (S (or or) (S (about about) (S (28.1 28.1) (million million)))))))))))))))))))"

预期结果:

out = "(S (S (S (S (S Skipper) (S 's)) (S Inc.)) (S (S Bellevue) (S Wash.))) 
       (S (S said) (S (S it) (S (S signed) (S (S a) (S (S definitive) (S (S merger) 
       (S (S agreement) (S (S for) (S (S (S a) (S (S National) (S (S Pizza) (S (S Corp.) 
       (S unit))))) (S (S to) (S (S acquire) (S (S (S (S the) (S (S 90.6) (S %))) (S (S (S of) 
       (S (S (S Skipper) (S 's)) (S Inc.))) (S (S it) (S (S does) (S (S n't) (S own)))))) 
       (S (S for) (S (S (S 11.50) (S (S a) (S share))) (S (S or) (S (S about) (S (S 28.1) (S million)))))))))))))))))))"

我试着做:

import re

def sub(matched):
    return f"(S {matched.group(2)})" if matched.group(1) == matched.group(2) else str(matched.groups())

result = re.sub(r"\(([\.\%\'\w\d]+) ([\.\%\'\w\d]+)\)", sub, s)

但是我需要输入每种类型的单词(/d,/w)等。有没有一种一次性的方法来实现这一点?

标签: pythonregexstring

解决方案


您可以使用

(?<![^\s()])([^\s()]+)(?=\s+\1(?![^\s()]))

请参阅正则表达式演示。细节:

  • (?<![^\s()])- 一个否定的前瞻,它匹配一个不是紧接在前面的字符而不是空格的位置,(以及)
  • ([^\s()]+)- 第 1 组:一个或多个除空格以外的字符,(以及)
  • (?=\s+\1(?![^\s()]))- 与紧随其后的位置匹配的正向前瞻
    • \s+- 1 个或多个空格
    • \1- 组 1 值
    • (?![^\s()])- 除了空格之外,不能有任何字符,(并且)紧挨当前位置的右侧。

在 Python 中,使用

re.sub(r'(?<![^\s()])([^\s()]+)(?=\s+\1(?![^\s()]))', 'S', text)

推荐阅读