在本例中,我必须用最后一个标记(即c-c-c-c-comeoh-oh-oh-oh)替换所有出现的模式,例如comeoh,其中
连字符之间的字符数是任意的,可以是一个或多个字符
要匹配的标记是连字符中的最后一个标记,因此come中的c-c-come
输入字符串可能有一个或多个匹配项,如下所示:
c-c-c-c-come to home today c-c-c-c-come to me
oh-oh-oh-oh it's a bad life oh-oh-oh-oh
需要通过finditer找到匹配令牌的开始和结束位置

r = re.compile(pattern, flags=re.I | re.X | re.UNICODE)
for m in r.finditer(text):
   word=m.group()
   characterOffsetBegin=m.start()
   characterOffsetEnd=m.end()
   # now replace and store indexes

[更新]
假设那些连字符的单词不属于固定字典,我将向其添加以下约束:
连字符之间的字符数必须介于最小值和最大值之间,例如{1,3},以便捕获组必须匹配c-come,或c-c-come,但不能匹配像fine-tuning或类似inter-face等连字符的实词。

最佳答案

使用捕获组和回溯引用的选项可能是:

(?<!\S)(\w{2,3})(?:-\1)*-(\w+)(?!\S)

将匹配:
(?<!\S)负lookbehind,断言左边的不是非空白字符
(\w{2,3})在组1中捕获两到三次单词字符
(?:-\1)*重复0次以上匹配连字符,然后返回对组1中匹配内容的引用
-(\w+)匹配-然后匹配第2组中的1+字字符
(?!\S)负lookahead,断言右边的不是非空白字符
在替换中使用第二个捕捉组\\2r'\2
Regex demo | Python demo
例如
import re

text = "c-c-c-c-come oh-oh-oh-oh it's a bad life oh-oh-oh-oh"
pattern = r"(?<!\S)(\w{1,3})(?:-\1)*-(\w+)(?!\S)"
text = re.sub(pattern, r'\2', text)
print(text)

结果
come oh it's a bad life oh

关于python - Python查找所有出现连字的单词并在位置处替换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56448068/

10-12 22:16