Я только недавно запустил 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: первый аргумент должен быть строкой или скомпилированным шаблоном

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

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

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

1
JohnC 13 Апр 2019 в 23:27

2 ответа

Лучший ответ

Поскольку 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
blhsing 13 Апр 2019 в 21:07

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

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

0
dariober 13 Апр 2019 в 20:55