Python正则expression式删除\ n

我有一个问题。 我想要做的是对数据进行sorting,并在某些点创build新行。 目前,我的代码如下所示:

from __future__ import print_function import re NDoc = raw_input("Enter name of new document ")+".txt" log = open(NDoc, 'w') file = raw_input("Enter a file to be sorted ") extfile = file+".txt" xfile = open(file+".txt") for line in xfile: l=line.strip() l=re.sub("\n","",l) n=re.sub("(\B)(?=((MTH|HST|ENG)[|]))","\n",line) if len(n) > 0: nl=n.split("\n") for item in nl: log.write(item+"\n") #print(item) print ("The data from",extfile,"has been sorted into",NDoc) 

除了第三学期(ENG |)之后,我的数据中出现了新的一行,一切正常。 例如,如果我的数据文件是这样的:

 MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers MTH|lettersandnumbersHST| 

我期望它看起来像这样:

 MTH|lettersandnumbers HST|lettersandnumbers ENG|lettersandnumbers MTH|lettersandnumbers HST|lettersandnumbers ENG|lettersandnumbers MTH|lettersandnumbers HST| 

但它是给我这个:

 MTH|lettersandnumbers HST|lettersandnumbers ENG|lettersandnumbers MTH|lettersandnumbers HST|lettersandnumbers ENG|lettersandnumbers MTH|lettersandnumbers HST| 

现在我认为在添加新的\ n之前,用l=re.sub("\n","",l)来代替所有的\ n,为什么还有一个额外的行被创build,但是只有在ENG ?

提前感谢您的任何见解。

您的线路使用了错误的名称。

 l=line.strip() l=re.sub("\n","",l) 

应该

 line=line.strip() line=re.sub("\n","",line) 

或干脆

 line=line.strip().replace('\n', '') 

我认为你没有使用适当的工具。

你可能想要re.sub

  print(re.sub("([^\n])(MTH|HST|ENG)", r"\1\n\2", st)) 

简短解释:这个选项捕捉任何选项MTHHSTENG ,之前没有\n[^\n]是“除\n任何内容”),以及之前的字符,并在它们之间添加\n 。 结果是你所期望的。

例:

 >>> st = """MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers ... MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers ... MTH|lettersandnumbersHST|""" >>> print(re.sub("([^\n])(MTH|HST|ENG)", r"\1\n\2", st)) MTH|lettersandnumbers HST|lettersandnumbers ENG|lettersandnumbers MTH|lettersandnumbers HST|lettersandnumbers ENG|lettersandnumbers MTH|lettersandnumbers HST| 

在“ENG”之后,您的源数据中有空格。 把那些拿出来,你会没事的。

 l=re.sub(' ', '', l) 

你可以使用findall来匹配任何一种模式:

 s = """MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers MTH|lettersandnumbersHST|lettersandnumbersENG|lettersandnumbers MTH|lettersandnumbersHST|""" r= re.compile("([AZ]+\|[0-9a-z]+|[AZ]+\|)",) for line in s.splitlines(True): print("\n".join(r.findall(line))) 

输出:

 MTH|lettersandnumbers HST|lettersandnumbers ENG|lettersandnumbers MTH|lettersandnumbers HST|lettersandnumbers ENG|lettersandnumbers MTH|lettersandnumbers HST|