我一直在使用python和regex来清理文本文件。我一直在使用以下方法,它一直在工作:
mystring = compiledRegex.sub("replacement",mystring)
有问题的字符串是一个包含许多嵌入换行符的整个文本文件。一些已编译的正则表达式使用re.DOTALL
选项覆盖多行。如果编译的正则表达式中的最后一个字符是\ n,则上述命令将替换正则表达式的所有匹配项,除了以字符串末尾的最终换行符结尾的匹配项。事实上,当它们出现在字符串的最末端时,我还有其他几个涉及处理换行符和多个换行符的相关问题。谁能给我一个关于这里发生了什么的指针?提前谢谢。
答案 0 :(得分:3)
如果我正确地取消你,你所需要的就是在每一行的末尾获得一个没有换行符的文本,然后遍历这个文本以找到所需的单词,而不是尝试使用以下内容: / p>
data = (line for line in text.split('\n') if line.strip())# gives you all non empty lines without '\n'at the end
现在,您可以使用列表切片或正则表达式功能搜索/替换所需的任何文本。
或者您可以使用替换以便随时替换所有'\ n':
text.replace('\n', '')
答案 1 :(得分:2)
我敢打赌,你的文件不会以换行符结尾...
>>> content = open('foo').read()
>>> print content
TOTAL:.?C2
abcTOTAL:AC2
defTOTAL:C2
>>> content
'TOTAL:.?C2\nabcTOTAL:AC2\ndefTOTAL:C2'
...所以最后一行与正则表达式不匹配:
>>> regex = re.compile('TOTAL:.*?C2\n', re.DOTALL)
>>> regex.sub("XXX", content)
'XXXabcXXXdefTOTAL:C2'
如果是这种情况,解决方案很简单:只需匹配换行符或文件末尾($
):
>>> regex = re.compile('TOTAL:.*?C2(\n|$)', re.DOTALL)
>>> regex.sub("XXX", content)
'XXXabcXXXdefXXX'
答案 2 :(得分:0)
我无法很好地处理您的解释中发生的事情,但是您可以通过在文件中读取时使用单个换行符替换所有多个换行符来修复它。另一个选择可能是修剪()正则表达式除去最后的\ n,除非你需要它。
答案 3 :(得分:0)
问号是否一次阻止正则表达式匹配多个iine?如果是这样,那么您可能希望使用MULTILINE标志而不是DOTALL标志。 ^符号现在将在新行或字符串的开头之后匹配,$符号现在将在换行符或字符串结尾之前匹配。 例如
regex = re.compile('^TOTAL:.*$', re.MULTILINE)
content = regex.sub('', content)
然而,这仍然留有空行的问题。但是为什么不在最后运行一个额外的正则表达式来删除空行。
regex = re.compile('\n{2,}')
content = regex.sub('\n', content)