我无法理解以下输出:
import re
re.sub(r'(?:\s)ff','fast-forward',' ff')
'fast-forward'根据文件:
返回通过替换repl替换字符串中最左边的模式不重叠出现的字符串所获得的字符串。
那么,既然我在捕获的标签之前添加了一个非捕获标记,那么为什么捕获的空格会出现,然后被替换呢?
我希望有以下产出:
' fast-forward'发布于 2018-06-14 12:32:06
非捕获群仍然匹配并使用匹配的文本。注意,使用意味着将匹配的文本添加到匹配值(为整个匹配的子字符串分配内存缓冲区)和相应的regex索引的前进。因此,(?:\s)将空格放入匹配值,并将其替换为ff。
您希望使用向后看来检查模式,而不使用它:
re.sub(r'(?<=\s)ff','fast-forward',' ff')见regex演示。
此方法的另一种选择是在需要保留的模式的部分周围使用捕获组,并在替换模式中使用替换反向引用:
re.sub(r'(\s)ff',r'\1fast-forward',' ff')
^ ^ ^^ 在这里,(\s)将空白保存在Group 1内存缓冲区中,替换中的\1将检索空白,并添加到替换字符串结果中。
import re
print('"{}"'.format(re.sub(r'(?<=\s)ff','fast-forward',' ff')))
# => " fast-forward"发布于 2018-06-14 12:41:32
非捕获组仍然与其包含的模式匹配。你想要表达的是一个回头看,它不匹配它的模式,而只是断言它是存在于你的比赛之前。
虽然,如果要对空白使用“后看”,您可能需要考虑使用单词边界元字符\b。它匹配\w和\W字符之间的空字符串,断言模式位于单词的开头。
import re
re.sub(r'\bff\b', 'fast-forward', ' ff') # ' fast-forward'添加尾随\b还将确保只有当'ff'被空格包围时才匹配它,而不是在单词的开头(例如在'ffoo'中)。
见演示。
https://stackoverflow.com/questions/50857600
复制相似问题