Замена символов внутри скобки с помощью регулярного выражения

#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