2016-11-08 1 views
0

У меня есть XML, как файл с тегами, как:Заменить все слэш по обратной косой черты в пределах указанного тега для пути к файлу

<id>SomeID</id> 
<datasource>C:/projects/my_project/my_file.jpg</datasource> 
<title>My title can include/and other characters</title> 
<abstract></abstract> 

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

Каков общий синтаксис регулярного выражения для этого? UPDATE: я, наконец, добрался до первого рабочего раствора с питоном:

regex_01 = re.compile(".*<datasource>") 
regex_02 = re.compile("</datasource>.*") 
file_content = ""   
for line in source_file.readlines(): 
    if "<datasource>" in line: 
     start = regex_01.search(line).group() 
     end = regex_02.search(line).group() 
     part_to_replace = line.replace(start,"").replace(end,"") 
     replaced = part_to_replace.replace("/","\\") 
     file_content = file_content + start + replaced.strip() + end + "\n" 
    else: 
     file_content = file_content + line  

Не могли бы вы предложить что-то более элегантное?

+0

Можете ли вы использовать '(* SKIP) (* FAIL)' - на каком языке? (только для Perl, PCRE и Python) – antoni

+0

@antoni Я начал тестировать в блокноте ++, но, я думаю, это не удастся сделать это там, поэтому я учусь для решения в ** python ** – Miro

ответ

1

Вы можете попробовать это с пропуском/незачет синтаксис:

(?:<datasource>[^/]*?|.*(?=<datasource>)|(?=</datasource>).*)(*SKIP)(*FAIL)|/ 

Посмотри здесь работает: https://regex101.com/r/86gc4d/1.

Но этот для PCRE. В python (*FAIL) также может быть (?!), но для (*SKIP) Я не уверен.

Если я не ошибаюсь, он должен быть добавлен в новейшее средство программирования regex python: https://pypi.python.org/pypi/regex.

Вы можете найти документацию (*SKIP)(*FAIL) синтаксиса здесь: http://www.rexegg.com/backtracking-control-verbs.html#skipfail, где он также говорит, что он работает в Python на примере этого пункта:

# Python 
# if you don't have the regex package, pip install regex 

import regex as mrab 

# print(regex.__version__) should output 2.4.76 or higher 
print(mrab.findall(r'{[^}]*}(*SKIP)(*FAIL)|\b\w+\b', 
        'good words {and bad} {ones}')) 
# ['good', 'words'] 

Надеется, что это помогает!

+0

Спасибо, в конце я создал громоздкий, но рабочий код. Не уверен, что у меня есть регулярное выражение, проверит его позже и примите этот ответ, если он работает :) – Miro

0

Попробуйте это:

(?=ce>)[\s\S]*?(?<=<\/d) 

Демо: https://regex101.com/r/VVcUMy/2

+0

Это не то, что Миро пытается делать. Он пытается заменить косые черты обратной косой чертой только внутри тега данных. – antoni

Смежные вопросы