Как я могу указать переменную в качестве первого аргумента в re.sub - PullRequest
1 голос
/ 13 апреля 2019

Я только недавно запустил python и никогда раньше не писал никакого кода.Я использовал регулярное выражение для сопоставления строки во входном файле (что было успешно), но я действительно изо всех сил пытаюсь найти способ заменить эту строку в файле другой, используя регулярное выражение.

with open( fileToSearch, "r+" ) as file:
for line in fileinput.input( fileToSearch ):
    string4=line
    result1 = re.search(r'(KNOWLEDGECENTER\/.*?\/)' + re.escape(taxonomy), string4)
    print (result1)
    result2 = re.sub(result1, r'(KNOWLEDGECENTER\/\t(\1)\/\)' + taxonomy, string4)
    print (result2)
    file.write(result2)  

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

повышение TypeError, «первый аргумент должен быть строкой или скомпилированным шаблоном» TypeError: firstаргумент должен быть строковым или скомпилированным шаблоном

Если я помещу переменную result1 в кавычки в операторе re.sub, как показано ниже, я не получаю сообщение об ошибке, но входной файл не обновляется сзамещающая строка

result2 = re.sub('result1', r'(KNOWLEDGECENTER\/\t(\1)\/\)' +  
taxonomy, string4)

код re.search работает так, что print (result1) возвращает: <_sre.SRE_Match объект в 0x02A120E0> для каждой строки во входном файле

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Поскольку re.sub сам может выполнять поиск, вам не нужен отдельный вызов re.search. Фактически, вы потеряете группу захвата в регулярном выражении для вашего вызова на re.search в полученном совпадении, поэтому обратная ссылка в строке замены в вашем вызове на re.sub не сможет ссылаться ни на что. Объедините два вызова, и это сработает (в приведенном ниже примере кода предполагается, что все, что вам нужно сделать, это добавить вкладку после KNOWLEDGECENTER/:

for line in fileinput.input(fileToSearch):
    result = re.sub('(KNOWLEDGECENTER/)(.*?/' + re.escape(taxonomy) + ')', r'\1\t\2', line)
    file.write(result)
0 голосов
/ 13 апреля 2019

search возвращает объект ( MatchObject ) с различными атрибутами, связанными с соответствием регулярному выражению, а не строкой или скомпилированным шаблоном, следовательно, ошибкой.Может быть, вам нужно re.sub(results1.group(0), ...)

(Кстати, у вас есть ключевое слово python 2.7. Если вы используете именно эту версию, рассмотрите возможность обновления до python 3)

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