2015-09-20 4 views
0

Мой код не работает, его выход «s все тот жезаменить многострочный строку с регулярным выражением с помощью питона

from sys import argv 
import re 

script, filename = argv 
f = open(filename, "r") 
str = f.read() 
f.close() 
str2 = re.sub("<start>.*</start>","aa",str,re.DOTALL | re.M) 
print str2 

Тестовый файл

<start><a> 
</a><a></a><a></a></start> 
+1

Вы говорите, что это не работает. Но вы не сказали, что должен делать ваш код? Или как это не работает, что еще вы получаете? –

ответ

2

As per Python docs fourth argument in re.sub is not regex flag but a count.

Это должно работать:

>>> print re.sub(r"<start>.*?</start>", "aa", str, 0, re.DOTALL) 
aa 

Или с первой компиляции регулярного выражения:

>>> regex = re.compile(r"<start>.*?</start>", re.DOTALL) 
>>> print re.sub(regex, "aa", str) 
aa 

Или даже это должно работать:

>>> print re.sub(r"<start>[\s\S]*?</start>", "aa", str) 
aa 

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

0

Я не уверен, что ваш предназначен результат, но если вы пытаетесь заменить все между <start> и </start> тогда следующий будет работать:

text = """<start><a> 
</a><a></a><a></a></start>""" 

print re.sub(r'(\<start\>).*(\<\/start\>)', r"\1aa\2", text, flags=re.DOTALL | re.M) 

Это даст вам:

<start>aa</start> 

Вы должны действительно избежать символов < и > в своем регулярном выражении. Кроме того, лучше практика использовать with заявление при работе с файлами:

from sys import argv 
import re 

script, filename = argv 

with open(filename, "r") as f: 
    text = f.read() 

text2 = re.sub(r'(\<start\>).*(\<\/start\>)', r"\1aa\2", text, flags=re.DOTALL | re.M) 
print text2 

Это будет заботиться автоматически закрывать файл. Наконец, лучше не использовать переменное имя str, так как оно скрывает встроенную функцию str() Python.

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