当字符串为模式时,Python会替换单词而不是单词的一部分

时间:2019-06-20 18:18:30

标签: python regex

我有一个这样的单词模式: *_you_don't_* think_you_don't_* you_don't_*_* you_don't_know_your_youth

我只想在单词“ you”用单词“ we”代替它时,用“ we”代替。

我尝试使用单词边界功能,但仅在将文本分隔为单词时有效,并且在我的情况下,使用下划线,星号等形成图案

import re
s = "*_you_don't_* think_you_don't_* you_don't_*_* you_don't_know_your_youth"
re.sub(r'\you\b', 'we', s)

在上面的示例中,我希望单词看起来像这样: *_we_don't_* think_we_don't_* we_don't_*_* we_don't_know_your_youth

用代码,我写到我无法达到那个结果。

5 个答案:

答案 0 :(得分:1)

尝试使用正则表达式:(?<=\b|_)you(?=\b|_)

Demo

答案 1 :(得分:1)

[a-zA-Z] - Matches anything that is a single character

![a-zA-Z] - Anything that is not a single English character

? - One or zero match of pattern

(?<![a-zA-Z])you(?![a-zA-Z]) - This matches "you" if not preceded and 
not followed by a letter

代码:

import re
s = "*_you_don't_* think_you_don't_* you_don't_*_* you_don't_know_your_youth"
print re.sub(r'(?<![a-zA-Z])you(?![a-z-Z])', 'we', s)

输出:

*_we_don't_* think_we_don't_* we_don't_*_* we_don't_know_your_youth

Demo

答案 2 :(得分:1)

因为您知道想要什么,所以将不需要的内容用于边界条件。

(?<![^\W_])you(?![^\W_])

https://regex101.com/r/z2TDXA/1

答案 3 :(得分:0)

使用.replace()

s = "_you_don't_ think_you_don't_* you_don't__ you_don't_know_your_youth"
string.replace('_you_', '_we_').replace(' you_', ' we_')

输出

  

“ _ we_don't_ think_we_don't_ * we_don't__ we_don't_know_your_youth”

答案 4 :(得分:0)

我能想到的最简单的方法是将re.sub与反向引用组一起使用。您可以使用以下方法完成任务。

re.sub(r'([_|\s])(?:you)(_)', r"\1we\2", s)

在这里,它是([_|\s])中的第一组,第二组是(_)(?:you)是一个非捕获组。在替换字符串\ 1和\ 2中指的是上述组。因此,最终您的替换字符串变为<whatever character before you>we<whatever character after you>