Python заменяет слова, а не часть слов, когда строка является шаблоном - PullRequest
0 голосов
/ 20 июня 2019

У меня есть набор слов вроде этого: *_you_don't_* think_you_don't_* you_don't_*_* you_don't_know_your_youth

Я хочу заменить слово «ты» словом «мы», только когда это слово, а не когда оно является частью слова.

Я пытался использовать функцию границы слова, но она работает только тогда, когда текст разделяется на слова, и в моем случае шаблон формируется с использованием подчеркивания, звездочки и т. Д.

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 ]

1 голос
/ 20 июня 2019

Поскольку вы знаете, что вы хотите, используйте то, что вы не хотите, для граничных условий.

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

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

1 голос
/ 20 июня 2019

Попробуйте Regex: (?<=\b|_)you(?=\b|_)

Демо

1 голос
/ 20 июня 2019
[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

Демо

0 голосов
/ 20 июня 2019

Самый простой способ, который я могу придумать, - это использовать re.sub с группами обратных ссылок.Для выполнения вашей задачи вы можете использовать следующее:

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

Здесь первая группа в ([_|\s]), а вторая группа (_).(?:you) - это группа без захвата.В строке замены \ 1 и \ 2 ссылаются на вышеупомянутые группы.Так что в конечном итоге ваша замещающая строка становится <whatever character before you>we<whatever character after you>

0 голосов
/ 20 июня 2019

С .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_d't_ think_we_dont_ * we_d't__ we_dак_know_your_youth"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...