python re.sub newline multiline dotall



我有这个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

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

当您使用re.compile时,您需要保存返回的正则表达式对象,然后调用sub。您还需要有一个。*来匹配任何字符,而不是匹配关闭html标记。re.MULTILINE标志仅用于字符串的开始和结束符号(^和$),因此在本例中不需要它。

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

应该可以。您不需要将replace转换为字符串,因为它已经是字符串了。

或者你可以写一个不使用。

的正则表达式。
replace = re.sub('"(,|n)*D','",D',text)

使用re.sub和多行文本

#!/usr/bin/env python3
import re
output = open("newFile.txt","w")
input = open("myfile.txt")
file = input.read()
input.close()
text = input.read()
replace = re.sub("value1ns +nickname", "valuens +name", text, flags=re.DOTALL)
output.write(replace)
output.close()

最新更新