Saya ingin menghapus kata-kata yang digandakan di dalam tanda kurung dan menggantinya dengan "S" + kata. Kata-kata dapat berupa apa saja - termasuk karakter khusus, desimal, periode waktu, kata dengan tanda penghubung, dll.

Untuk misalnya:

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

Ini stringnya, 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)))))))))))))))))))"

Hasil yang diharapkan:

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

Saya mencoba melakukan:

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)

Tetapi saya perlu memasukkan kata per jenis (/ d, /w) dll. Apakah ada cara sekali pakai untuk mencapai ini?

2
nikinlpds 23 Desember 2020, 17:04

2 jawaban

Jawaban Terbaik

Kamu bisa memakai

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

Lihat demo regex. Detail:

  • (?<![^\s()]) - tampilan depan negatif yang cocok dengan lokasi yang tidak langsung didahului dengan karakter selain spasi, ( dan )
  • ([^\s()]+) - Grup 1: satu atau lebih karakter selain spasi, ( dan )
  • (?=\s+\1(?![^\s()])) - pandangan ke depan positif yang cocok dengan lokasi yang langsung diikuti dengan
    • \s+ - 1 spasi putih atau lebih
    • \1 - Nilai Grup 1
    • (?![^\s()]) - tidak boleh ada karakter selain spasi, ( dan ) tepat di sebelah kanan lokasi saat ini.

Dengan Python, gunakan

re.sub(r'(?<![^\s()])([^\s()]+)(?=\s+\1(?![^\s()]))', 'S', text)
1
Wiktor Stribiżew 23 Desember 2020, 14:12

Ini akan melakukannya:

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

Dan substitusi Anda adalah (S \1)

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

0
MonkeyZeus 23 Desember 2020, 15:48