python re.sub换行符multiline dotall

时间:2015-08-14 20:49:14

标签: python replace newline multiline

我有这个CSV,上面写着下一行(请注意换行符/ n):

"<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

2 个答案:

答案 0 :(得分:7)

您根本不需要编译语句,因为您没有使用它。您可以将已编译的模式或原始模式放在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'))

答案 1 :(得分:2)

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

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

那应该有用。您不需要将替换为字符串,因为它已经是一个字符串。

备选方案,您可以编写一个不使用的正则表达式。

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