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))
简短解释:这个选项捕捉任何选项MTH
, HST
或ENG
,之前没有\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|