在CMD命令行输出字符串包含\r\n时,如何不换行?

有一段数据包含换行符,像这样:'点 N400350E1163510\r点 N400317E1163557\r点 N400544E1170300\r点 N395736E1170000\r点 N393524E1170000\r点 N392207E1164138\r点 N400350E1163510\rQNH2400 米(不含)以下'
我想用正则表达式匹配其中某一段数据,然后输出到CMD验证正确性。结果命令行把输出数据中的换行符都解析了,甚至我只能看到结果中最后一个\r后面的数据。所以有没有办法让CMD不解析数据中的换行符?请参照下面Python3代码来理解我说的问题。一开始我还一直在找自己的正则表达式哪里是写错了,可最后打印了result.groups()和len(group(1))之后才发现这个问题所在(本问题不是讨论正则表达式)。
就算不能解决也没有关系,这个问题算是自己对Windows CMD做个提醒,希望跟我碰到同样问题的朋友也能看到。

import re

text='点 N400350E1163510\r点 N400317E1163557\r点 N400544E1170300\r点 N395736E1170000\r点 N393524E1170000\r点 N392207E1164138\r点 N400350E1163510\rQNH2400 米(不含)以下'

#数据的起点和终点是相同的
#比如这段数据"点 N400350E1163510"出现了两次,就是我要的一段数据
result=re.search(r'((.+ N[0-9]{6}E[0-9]+(?=[\r])).+\2).+',text)
if result:
    # print(result.groups())
    print('g1:%s\tg2:%s' % (result.group(1),result.group(2)))
    # print('length of g1:%d\tg2:%d' % (len(result.group(1)),len(result.group(2))))
    #结论:上面代码在CMD表面看起来结果是一样
    #但是打印长度和result.groups()之后就明白怎么回事了
    #有时候数据太多没来得及想到会是CMD的问题,所以为了以后可能会继续被CMD干扰还是希望能找到解决办法 
    #result.groups()是数组打印出来是不会解析换行符的,但是如果有意去list(str)然后输出,那说明已经注意到这个问题所在了。
    #所以我们更多的时候在平常正常打印str时怎么解决?不用CMD吗、

我自己也写了一个输出到文件有助于调试数据的常用函数:

    #程序运行时输出data到文件。
    #当clear=True(默认),也就是文件只保存这一次运行data的数据。
    #类似于CMD输出
    def output_file(self,filename,data,op='a',encoding='gb18030',clear=True,new_line=True):
        #当op为a追加读写文件时,clear标志在程序第一次调用次函数时是否先清空文件
        if op == 'a' and clear:
            
            if not hasattr(self,'clear_request'):
                self.clear_request={}
            
            #用文件名标记clear状态
            if filename not in self.clear_request.keys():
                #改为wt模式就当是清空了
                op='wt'
            else:
                pass
            self.clear_request[filename]=clear
                
        if type('') != type(data):
            data=str(data)
        if new_line:
            data=data+'\r'
        with open(filename,op,encoding=encoding) as f:
            f.write(data)

另外我还有一个关于控制变量打印输出次数的的提问,已得到解答,完成了函数精简的实现。
参见:https://segmentfault.com/q/10...

阅读 7.9k
1 个回答

r表示回到行首,
也就是说实际上你想打印的东西都输出了,只是在打印的过程中每次遇到r后,后面的数据返回行首然后覆盖掉了前面的数据,如果确实想看到所有的数据的话,你应该先把r处理掉

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题