Python Regex删除\ n

时间:2015-07-27 19:08:19

标签: python regex excel vba

我遇到了问题。我想要做的是对数据进行排序并在某些点创建新行。目前,我的代码如下所示:

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,所以为什么还有额外的行,但只有在ENG之后?

提前感谢您的任何见解。

4 个答案:

答案 0 :(得分:1)

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

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

应该是

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

或只是

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

答案 1 :(得分:1)

我认为您没有使用正确的工具。

您可能需要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|

答案 2 :(得分:0)

“ENG”之后的源数据中有空格。把它们剥掉然后就可以了。

ls

答案 3 :(得分:0)

您可以使用findall匹配任一模式:

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

输出:

RMProjectedRect