2015-08-14 73 views
4

我有这个CSV写有下一行(请注意换行/ N):蟒蛇应用re.sub换行符多DOTALL

"<a>https://google.com</a>",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 
,,Dirección 

我想删除所有逗号,并把地址一个排队。因此,关于Python我使用这个:

with open('Reutput.csv') as e, open('Put.csv', 'w') as ee: 
    text = e.read() 
    text = str(text) 
    re.compile('<a/>*D', re.MULTILINE|re.DOTALL) 
    replace = re.sub('<a/>*D','<a/>",D',text) #arreglar comas entre campos 
    replace = str(replace) 
    ee.write(replace) 
f.close() 

据我所知,re.multiline和re.dotall有必要完成/ N的需求。我使用的是re.compile,因为它是我知道添加它们的唯一方式,但显然在这里不需要编译它。

我怎样才能完成这个文本?

"<a>https://google.com</a>",Dirección 

回答

6

,因为你不使用它,您不需要编译语句在所有。您可以将编译的模式或原始模式放入re.sub函数中。您也不需要MULTILINE标志,这与您不使用的^和$元字符的解释有关。

问题的核心在于您正在将标志编译为正则表达式模式,但由于您没有在替换命令中使用编译模式,因此无法识别。

还有一件事。 re.sub返回一个字符串,所以replace = str(replace)是不必要的。

下面是我工作:

import re 
with open('Reutput.csv') as e: 
    text = e.read() 
    text = str(text) 
    s = re.compile('</a>".*D',re.DOTALL) 
    replace = re.sub(s, '</a>"D',text) #arreglar comas entre campos 
    print(replace) 

如果你只需要调用应用re.sub无需编译,你需要调用它像

re.sub('</a>".*D', '</a>"D', text, flags=re.DOTALL)

我不知道到底是什么你应用程序当然是,但如果您只想删除所有逗号和换行符,则可能会更清晰地编写

replace = ''.join((c for c in text if c not in ',\n')) 
+0

您的解决方案运行顺利! :)谢谢你的解释扫罗;我非常感谢他们。最好的祝愿 – Abueesp

+0

@Alfredo Bueno如果你的问题解决了,你应该接受一个答案,给它一个绿色的复选标记。这将有助于任何人在未来提及你的问题。 – saulspatz

2

当您使用re.compile您需要保存返回Regular Expression对象,然后调用子上。你还需要有一个。*来匹配任何字符,而不是匹配关闭html标签。 re.MULTILINE标志仅用于开始和结束字符串符号(^和$),所以在这种情况下您不需要它。

regex = re.compile('</a>.*D',re.DOTALL) 
replace = regex.sub('</a>",D',text) 

这应该工作。您不需要将替换转换为字符串,因为它已经是一个字符串。

另一种方法是你可以编写一个不使用的正则表达式。

replace = re.sub('"(,|\n)*D','",D',text) 
+0

绝对是的。此外,由于你的答案,我明白退出更好的重新工作。我真的很感激。 – Abueesp