Заменить часть строки, соответствующую шаблону

Это мой первый день работы с Python, так что извините за этот вопрос

Проблема: в файле замените каждое вхождение trim(column_name) на TRIM (TRIM (CHR (09) FROM column_name)). Я уже разобрался, как выполнять поиск по шаблону, и познакомился с функцией re.sub().

шаблон, который соответствует моему случаю,

p = re.compile ('trim\([a-z0-9_]+\)',re.I)

но как заменить соответствующий шаблон, сохранив имя столбца???

Необходимый вывод, например, выглядит следующим образом:

input: select trim(API12), trim(FIELD_CODE) from table
output: select TRIM (TRIM (CHR (09) FROM API12)), TRIM (TRIM (CHR (09) FROM FIELD_CODE)) from table

person Dennis    schedule 21.02.2014    source источник
comment
использовать обратную ссылку \1   -  person Karoly Horvath    schedule 21.02.2014
comment
не могли бы вы рассказать об этом немного подробнее?   -  person Dennis    schedule 21.02.2014
comment
Я думаю, что этот ответ будет полезен stackoverflow.com/questions/3997525/python -заменить-регулярным выражением   -  person Andrey Rusanov    schedule 21.02.2014
comment
это то, чем я сейчас занимаюсь :)   -  person Dennis    schedule 21.02.2014


Ответы (2)


Рабочий код:

import re
i = 'select trim(API12), trim(FIELD_CODE) from table'
re.sub(r"trim\((\w+)\)", r"TRIM (TRIM (CHR (09) FROM \1))", i)

Объяснять

  1. Вам не нужно использовать флаг re.I, вместо этого используйте \w, это эквивалентно [a-zA-Z0-9_].
  2. \(\) означает нормальную скобку, () означает группировку
  3. используйте \1 для рендеринга первой группы соответствия, \2 для второй.
person Colin Su    schedule 21.02.2014

Я только что разобрался с этим для себя

Спасибо за вашу помощь!

import re

line = "select trim(API12), trim(FIELD_CODE) from dual"

output = re.sub(r'trim\(([a-zA-Z0-9_]+)\)',r'TRIM (TRIM (CHR (09) FROM\1))',line)

print output

>> выберите TRIM (TRIM (CHR (09) FROM API12)), TRIM (TRIM (CHR (09) FROM FIELD_CODE)) из двойного

person Dennis    schedule 21.02.2014