我必须用连字符(如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-ohfinditer找到匹配令牌的开始和结束位置
R= re.compile(pattern,flags=re.I欧元re.X \ re.UNICODE)用于r.finditer(Text)中的m: word=m.group() characterOffsetBegin=m.start() characterOffsetEnd=m.end() #现在替换和存储索引更新
假设这些连字符词不属于固定的字典,我将在其中添加以下约束:
{1,3},以便捕获组必须匹配c-come或c-c-come,而不是像fine-tuning或inter-face之类的连字符实数。发布于 2019-06-04 16:59:33
使用捕获组和反向引用的选项可能是:
(?<!\S)(\w{2,3})(?:-\1)*-(\w+)(?!\S)与此相匹配:
(?<!\S)负查找,断言左边的不是非空格字符(\w{2,3})捕获一个单词字符2次或3次(?:-\1)*重复0+次数匹配连字符,然后反向引用第1组中匹配的内容-(\w+)匹配-,然后匹配第2组中的1+单词字符(?!\S)负前瞻,断言右边的不是非空格字符在替换中使用第二个捕获组\\2或r'\2
例如
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发布于 2019-06-04 16:46:06
只需使用re.sub()替换所有索引,而不必对匹配的索引进行迭代:
import re
s = 'c-c-c-c-come to home today c-c-c-c-come to me'
print(re.sub(r'(\w+(?:-))+(\w+)', '\\2', s))
# come to home today come to me发布于 2019-06-04 16:48:31
这里有一个可能的表达式:
import re
text = ("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")
pattern = r"(?<=-)\w+(?=[^-\w])"
r = re.compile(pattern, flags=re.I | re.X | re.UNICODE)
for m in r.finditer(text):
word = m.group()
characterOffsetBegin = m.start()
print(word, characterOffsetBegin)输出:
come 8
come 35
oh 56https://stackoverflow.com/questions/56448068
复制相似问题