Python заменяет слова, а не часть слов, когда строка является шаблоном

У меня есть такая схема слов: *_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

и с кодом я написал, что не могу добиться такого результата.

s.replace(' you ', ' we ') ? (и, очевидно, если не слово находится в начале или в конце предложения).
Austin 20.06.2019 20:21
в моем случае узор формируется с помощью подчеркивания Тогда не могли бы вы сделать простую замену _you_ на _we_?
John Gordon 20.06.2019 20:25

Граница слов \b здесь не работает, потому что между буквой и подчеркиванием нет границ слов.

Toto 20.06.2019 20:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
671
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

С .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"

Ответ принят как подходящий

Попробуйте регулярное выражение: (?<=\b|_)you(?=\b|_)

Демо

[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

Демо

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

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

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

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

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

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

Другие вопросы по теме