#python #regex
#python #регулярное выражение
Вопрос:
У меня есть строка, которая выглядит как:
str = "hello <abc123> python <is456> awesome"
и я хочу заменить символы внутри скобок некоторыми другими символами. Как и в приведенной выше строке, должно быть:
"hello lock python lock awesome "
Я попробовал что-то вроде:
ss = str.replace("\<(.*?)\>", 'lock')
но это не сработало. Итак, как я могу это сделать с помощью регулярного выражения?
Комментарии:
1. куда
awesome
делось?2. replace() ожидает два параметра типа str, и вы передаете шаблон. Неверно!
3. пожалуйста, имейте в виду, что использовать
str
в качестве имени переменной в Python — плохая идея, поскольку это имя типа.4. Вы должны использовать необработанные строки для регулярного выражения, как в r'<(.*?)>’ вместо «\<(.*?)\>
5. В отличие от Javascript, встроенный
replace
метод Python strings использует шаблон обычного текста. Функциональность регулярных выражений находится в модуле стандартной библиотекиre
. Хотя на вопрос уже дан ответ, вы можете захотеть прочитать всю документацию .
Ответ №1:
Вы могли бы выполнить простую re
замену gex следующим образом,
>>> import re
>>> str = "hello <abc123> python <is456> awesome"
>>> re.sub(r'<.*?>', 'lock', str)
'hello lock python lock awesome'
Ответ №2:
Этого будет достаточно (объединение утверждений lookbehind / lookahead с нежадным сопоставлением .
):
before = "hello <abc123> python <is456> awesome"
after = re.sub(r'(?<=<). ?(?=>)', 'lock', before)
print(after)
Вывод:
hello <lock> python <lock> awesome
Если вам не нужны скобки, то re.sub(r'<. ?>', 'lock', before)
все должно быть в порядке.
Комментарии:
1. Это не исключает угловые скобки.
2. @DirtyBit да, я написал это, затем перечитал вопрос еще раз, затем отредактировал свой ответ, чтобы добавить последнюю строку.
Ответ №3:
>>> import re
>>> s ="hello <abc123> python <is456> awesome"
>>> re.sub('<.*?>', 'lock', s)
'hello lock python lock awesome'
Ответ №4:
import re
str="hello <abc123> python <is456> awesome"
re.sub('<(.*?)>','lock',str)
Результат:
'hello lock python lock awesome'
Объяснение
1.< : < — это мета-символ, и его необходимо экранировать, если вы хотите сопоставить его буквально.
2. (.*?) : сопоставьте все не жадным способом и зафиксируйте это.
3. > : > это мета-символ, и его нужно экранировать, если вы хотите сопоставить его буквально.
Ответ №5:
Я попробовал здесь следующее регулярное выражение и получил 2 группы совпадений, по одной на каждый <something>
набор:
regex = r"^.*(<S >).*(<S >).*$"
Ответ №6:
Используйте приведенный ниже regx:
import re
s = "hello <abc123> python <is456> awesome"
result = re.sub(r'<[^<>] >', "lock", s)
print(result)
Вывод:
hello lock python lock awesome