鍍金池/ 問答/Python  網絡安全  Office/ 在CMD命令行輸出字符串包含\r\n時,如何不換行?

在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))之后才發(fā)現這個問題所在(本問題不是討論正則表達式)。
就算不能解決也沒有關系,這個問題算是自己對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的問題,所以為了以后可能會繼續(xù)被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狀態(tài)
            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...

回答
編輯回答
夢若殤

r表示回到行首,
也就是說實際上你想打印的東西都輸出了,只是在打印的過程中每次遇到r后,后面的數據返回行首然后覆蓋掉了前面的數據,如果確實想看到所有的數據的話,你應該先把r處理掉

2017年10月3日 14:08