首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非捕获字符python re.sub()的意外结果

非捕获字符python re.sub()的意外结果
EN

Stack Overflow用户
提问于 2018-06-14 12:30:09
回答 2查看 1.2K关注 0票数 5

我无法理解以下输出:

代码语言:javascript
复制
import re 

re.sub(r'(?:\s)ff','fast-forward',' ff')
'fast-forward'

根据文件:

返回通过替换repl替换字符串中最左边的模式不重叠出现的字符串所获得的字符串。

那么,既然我在捕获的标签之前添加了一个非捕获标记,那么为什么捕获的空格会出现,然后被替换呢?

我希望有以下产出:

代码语言:javascript
复制
' fast-forward'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-14 12:32:06

非捕获群仍然匹配并使用匹配的文本。注意,使用意味着将匹配的文本添加到匹配值(为整个匹配的子字符串分配内存缓冲区)和相应的regex索引的前进。因此,(?:\s)将空格放入匹配值,并将其替换为ff

您希望使用向后看来检查模式,而不使用它:

代码语言:javascript
复制
re.sub(r'(?<=\s)ff','fast-forward',' ff')

regex演示

此方法的另一种选择是在需要保留的模式的部分周围使用捕获组,并在替换模式中使用替换反向引用:

代码语言:javascript
复制
re.sub(r'(\s)ff',r'\1fast-forward',' ff')
         ^  ^      ^^ 

在这里,(\s)将空白保存在Group 1内存缓冲区中,替换中的\1将检索空白,并添加到替换字符串结果中。

Python演示

代码语言:javascript
复制
import re 
print('"{}"'.format(re.sub(r'(?<=\s)ff','fast-forward',' ff')))
# => " fast-forward"
票数 7
EN

Stack Overflow用户

发布于 2018-06-14 12:41:32

非捕获组仍然与其包含的模式匹配。你想要表达的是一个回头看,它不匹配它的模式,而只是断言它是存在于你的比赛之前。

虽然,如果要对空白使用“后看”,您可能需要考虑使用单词边界元字符\b。它匹配\w\W字符之间的空字符串,断言模式位于单词的开头。

代码语言:javascript
复制
import re

re.sub(r'\bff\b', 'fast-forward', ' ff') # ' fast-forward'

添加尾随\b还将确保只有当'ff'被空格包围时才匹配它,而不是在单词的开头(例如在'ffoo'中)。

演示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50857600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档