在本例中,我必须用最后一个标记(即c-c-c-c-come
或oh-oh-oh-oh
)替换所有出现的模式,例如come
或oh
,其中
连字符之间的字符数是任意的,可以是一个或多个字符
要匹配的标记是连字符中的最后一个标记,因此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,断言右边的不是非空白字符在替换中使用第二个捕捉组
\\2
或r'\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/