替换以前出现的单词

2024-05-19 20:54:35 发布

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

我想删除括号内重复的单词,并将其替换为“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)等等。有没有一种一次性的方法来实现这一点


Tags: foragreementit单词mergerincskippersigned
3条回答

这可以做到:

\(([^()]+?) +\1\)

你的替代品是(S \1)

https://regex101.com/r/3CUxC6/1

你可以用

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

regex demo。详情:

  • (?<![^\s()])-与除空格、()之外没有紧跟在字符前面的位置相匹配的负前瞻
  • ([^\s()]+)-第1组:除空格以外的一个或多个字符,()
  • (?=\s+\1(?![^\s()]))-与紧跟其后的位置相匹配的正向前瞻
    • \s+-1个或多个空格
    • \1-组1值
    • (?![^\s()])-当前位置右侧必须紧靠()的空白字符

在Python中,使用

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

由于要匹配括号内的重复项,可以执行以下操作:

import re

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)))))))))))))))))))"""

res = re.sub(r'\((\S+)\s+\1\)', r'(S \1)', s)
print(res)

输出

(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)))))))))))))))))))

正则表达式:

  • \(匹配一个开括号
  • (\S+)匹配一个或多个非空白的组(将它们放入捕获组)
  • \s+匹配一个或多个空格
  • \1对第一个捕获组的反向引用,强制匹配完全相同的文本
  • \)匹配一个右括号

相关问题 更多 >