问题描述
||
我一直在使用正则表达式使用python清理文本文件。我一直在使用以下方法,并且通常可以正常工作:
mystring = compiledRegex.sub(\"replacement\",mystring)
有问题的字符串是一个包含许多嵌入式换行符的完整文本文件。使用re.DOTALL
选项,某些已编译的正则表达式涵盖多行。如果已编译的正则表达式中的最后一个字符为\\ n,则上述命令将替换正则表达式的所有匹配项,但以字符串末尾的最后一个换行符结尾的匹配项除外。实际上,当出现在字符串的末尾时,我无疑还有其他一些与换行符和多个换行符有关的问题。谁能给我指点一下这里发生了什么?提前致谢。
解决方法
我敢打赌,您的文件不会以换行符结尾...
>>> 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|$)\',content)
\'XXXabcXXXdefXXX\'
, 如果我正确地了解了您,并且您需要做的就是在每一行的末尾获取不带换行符的文本,然后遍历该文本以查找所需的单词,那么您可以尝试使用以下命令:
data = (line for line in text.split(\'\\n\') if line.strip())# gives you all non empty lines without \'\\n\'at the end
现在,您可以使用列表切片或正则表达式功能搜索/替换所需的任何文本。
或者,您可以使用replace来将所有\'\\ n \'替换为任何时候:
text.replace(\'\\n\',\'\')
, 根据您的解释,我无法很好地处理正在发生的事情,但是您可以通过在阅读文件时用一个换行符替换所有多个换行符来解决此问题。另一个选择可能是只修整正则表达式,最后删除\\ n,除非您需要它。
, 是不是要防止正则表达式一次匹配多个iine的问号?如果是这样,那么您可能希望使用MULTILINE标志而不是DOTALL标志。现在,^符号将在换行符或字符串开头之后匹配,而$符号将在换行符或字符串结尾之前匹配。
例如。
regex = re.compile(\'^TOTAL:.*$\',re.MULTILINE)
content = regex.sub(\'\',content)
但是,这仍然存在空行的问题。但是,为什么不在末尾运行一个额外的正则表达式来删除空行呢?
regex = re.compile(\'\\n{2,}\')
content = regex.sub(\'\\n\',content)