第一个python去掉行号
生活随笔
收集整理的這篇文章主要介紹了
第一个python去掉行号
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.sciencenet.cn/home.php?mod=space&uid=404069&do=blog&id=297132 (根據我在博客園上連載的四篇文章整理,見http://yanxy.cnblogs.com/,轉載請注明出處)
?????? 近兩天內的目標是在我博的每個欄目發一篇文章,先都占個坑再說,空著不好看:) 《程序設計》這個欄目里,就從我剛開始學的Python開始吧。
? 一、引言 Python是一種簡單卻又強大的語言,我覺得它很適合非專業程序員(特別是科研人員)使用。比如作一些科學計算、數據處理工作等,Python簡單的語法和豐富的第三方庫可以有效幫助我們提高工作效率。 本文并不主要介紹Python編程的語法,或Python怎么安裝、運行、調試等,有興趣可以到科學網潘超的Blog去看看,那里有一些不錯的入門資源。整理這篇文章的主要目的還是想介紹下我學、用Python的一些體會,希望能為大家提供借鑒。我學Python已經有十多天了,現在已經初步掌握了Python。我認為好的學習方法不光是看書或上網查資料,最好是能結合一個實際的例子一點點去深入,這樣掌握起來會更快更牢。我在寫了“Hello World”之后,第一個正式編的程序就是下面這個復制代碼時去除行號的小工具。
二、分析與設計 現在很多專業計算機技術網站提供的各種源代碼前,很多會帶有數字行號。我們將這些代碼復制下來運行前,要一行一行的去刪除前面的代碼,即浪費時間又容易出錯。如果有一個程序能快速、正確的去除掉代碼前的行號,無疑可以節省我們的很多時間(當然我寫這個程序花了大概有10幾個小時,不過正所謂“磨刀不誤砍柴工”嘛:)。 網上代碼前的行號排列大都比較有規律,多數采取如下形式: 1. abc 2. def ……………… 或 1 abc 2 def ……………… 以及[1]、1:、(1)等。 因此,要去除行號,首先就是要查找到每行的開頭數字及前后分割符號,然后替換掉他們。根據這個思路,很容易寫出如下的基本程序框架: 第1步:讀取全部n行代碼到一個字符串,然后將其轉換為包含n個子字符串的數組(或列表); 第2步:對于每一個子字符串,從左至右開始查找每個字符,如果找到一個或多個連續的、可轉換為整數的字符,就刪除其左側(包含數字自身位置)的全部字符,并用剩余部分生成一個新字符串。 第3步:如果新字符串左側有空白或:.])等分割符號,就去除掉它們,再用剩余部分生成一個新字符串。 第4步:將所有處理過的字符串順序連接起來,得到一個字符串,返回處理行號后的源代碼。
三、初步的實現——字符串替換 由于Python語言提供了良好的字符串操作功能,因此很快可以寫出一個初步的版本: #代碼1
??? multiStr = inStr.splitlines(1) #將多行文本拆分為文本列表
??? outStr = u''
??? for singleStr in multiStr: #循環用for in的結構,后邊也加冒號
??????? singleStr = singleStr.lstrip() #去除左側空白
??????? i=0?#迭代算子
??????? for charStr in singleStr: #從左至右循環查找字符
??????????? if charStr.isdigit():#如果判斷是數字類型
??????????????? i += 1 #迭代算子加1
??????? ????elif i>0: #找到了一個非數字字符,而且前邊已有數字字符
??????????????? singleStr = singleStr[i:] #返回從該位置起的剩余字符
??????????????? break #跳出循環
??????????? else: #如果都沒有,說明是空行
??????????????? break #跳出循環
??????? outStr += singleStr #將所有行組成完整代碼
??? return outStr #返回 (注意,# -*- coding: utf-8 -*-是使用utf-8編碼,可以支持中文字符) 以上代碼實現了基本程序框架中的1-3步,第4步由于情況較復雜(有的行號后有分割符,有的沒有,而且空格數量也不一樣),所以暫時用以下函數手工處理: #代碼2
??? outStr = u''
??? multiStr = inStr.splitlines(1)
??? for singleStr in multiStr:
??????? singleStr = singleStr[1:]
??????? outStr += singleStr
??? return outStr 這樣雖然苯拙一點,但至少解決了問題。 四、進一步優化——正則表達式替換
??? outStr = u''p = re.compile(r'\D*\d+\s?[.|:|\]|\)]?\s?') #編譯正則表達式
??? for singleLine in multiLine:
??????? outStr += p.sub( '', singleLine,count = 1 ) #用空字符替換每行的第一個匹配上述正則表達式的字符串
??? return outStr #返回累加后的字符串? 以上代碼中的咖色部分就是一個Regex,它的含義是:0或多個非數字字符 + 至少1個數字字符 + 0或1個空白字符 + 0或1個分隔符(包括點、冒號、右圓/方括號,可添加其他分隔符) + 0或1個空白字符。 以上Regex符合大多數代碼前行號的規則,刪除行號就是用空字符替換掉每行代碼中第一個匹配該Regex的字符串(注意只能是第一個,因為程序里可能會存在abc1.open等情況,如果全部匹配就會誤刪代碼)。 五、繼續優化——采用函數編程 代碼3看起來還不夠簡潔,沒關系,Python是一種“準”函數編程(Functional Programming,FP)語言,做這種簡化代碼的事情最拿手。在這里,我用到了兩種函數編程手段——匿名函數(lambda)和一種高階函數(map),將代碼簡化至一行,如下: #代碼4import re #導入Python的正則表達式模塊outStr = ''.join(map(lambda x:re.compile(r'\D*\d+\s?[.|:|\]|\)]?\s?').sub( '', x,count = 1 ),inStr.splitlines(1)))) 這樣代碼就只優化到了一行了,是不是很簡潔呢?當然代碼的可讀性受到一定影響。所以函數編程不能濫用。(濫用的例子可以見我的文章《學習Python列表內涵:一行代碼搞定雙倍超立方數計算》)。函數編程是個稍微復雜點的問題,我覺得掌握與否均可,所以就不很詳細地去解釋上述代碼了。如果對Python的函數編程感興趣,可以參考《可愛的 Python:Python 中的函數編程》,很不錯的一篇文章。 六、完整的程序——添加I/O 完整的程序肯定少不了輸入輸出功能。對于這個去除復制代碼行號的小工具,我想到的輸入輸出方式一共有三種: 1、文件方式 將復制的代碼存為一個文本文件,然后用程序讀取它,去掉行號后在寫回文件。這種方法應該說是最不方便的,可以算一下自己需要點多少下鼠標……麻煩,所以我沒有實現它。關于Python的文件操作內容,網上有很多資料,可以搜索一下。 2、窗口方式 將復制的代碼粘貼到一個窗體的文本框里,然后點擊按鈕去除行號,再從文本框里把處理后的代碼復制出來。這是比較常規的做法,我分別用wxPython和PyQt4實現了這項功能,源代碼見http://www.cnblogs.com/。由于GUI編程是個比較復雜的問題,我就不詳細展開了,以后有時間再寫。 3、剪貼板方式 復制代碼到剪貼板后,啟動處理行號程序,直接處理剪貼板內的文本,然后再復制到其他地方。這是最方便的一種方法,而且由于不用構建GUI,代碼量也會很少。見下邊:
#代碼5
# -*- coding: utf-8 -*-
import win32clipboard as c #import包的時候,如果包名太長,可以用as起一個別名
import win32con as w #以上兩個包都是專門針對windows平臺的,注意
import re
c.OpenClipboard() #打開剪貼板
strList = c.GetClipboardData(w.CF_TEXT).splitlines(1) #讀取剪貼板內容到一個字符列表
c.EmptyClipboard() #清空剪貼板
c.SetClipboardData(w.CF_TEXT, ''.join(map(lambda x:re.compile \
??? (r'\D*\d+\s?[.|:|\]|\)]?\s?').sub( '', x,count = 1 ),strList )))
???? #將去處行號后的字符寫回剪貼板,此處用到代碼3
c.CloseClipboard() #關閉剪貼板 七、總結 以上就是我初學Python作的第一個程序,雖然很簡單,但在編寫這個程序的過程中,我學習到了: 1、Python的基本語法、類型與邏輯控制 2、Python的函數定以及函數編程方法 3、Python的圖形用戶界面設計(GUI) 4、正則表達式及其在Python中的應用 短時間內就可以學會這么多內容,足以說明Python的簡單易學,你也應該能體會到Python的強大吧。此外,在完成這個程序的過程中,我所用到的基本思路是: 1、由粗到細 先根據功能要求實現程序邏輯框架,然后用你所掌握的最基本方法實現初步版本,先讓程序能用。在此基礎上,再去看是否有繼續優化的可能(從代碼簡潔性或效率兩方面),逐步細化,這時候才是提高的過程。 2、自內而外 先實現核心算法,再添加外圍功能(I/O,GUI等)。有些編程初學者熱衷于用IDE去拖拉控件、美化界面等(當然這項工作也是必要的),沒有把更多精力集中到核心算法中去,這樣不利于真正學好一門語言。 當然這個程序還有很多需要完善的地方,歡迎提出你的意見或建議。
?????? 近兩天內的目標是在我博的每個欄目發一篇文章,先都占個坑再說,空著不好看:) 《程序設計》這個欄目里,就從我剛開始學的Python開始吧。
? 一、引言 Python是一種簡單卻又強大的語言,我覺得它很適合非專業程序員(特別是科研人員)使用。比如作一些科學計算、數據處理工作等,Python簡單的語法和豐富的第三方庫可以有效幫助我們提高工作效率。 本文并不主要介紹Python編程的語法,或Python怎么安裝、運行、調試等,有興趣可以到科學網潘超的Blog去看看,那里有一些不錯的入門資源。整理這篇文章的主要目的還是想介紹下我學、用Python的一些體會,希望能為大家提供借鑒。我學Python已經有十多天了,現在已經初步掌握了Python。我認為好的學習方法不光是看書或上網查資料,最好是能結合一個實際的例子一點點去深入,這樣掌握起來會更快更牢。我在寫了“Hello World”之后,第一個正式編的程序就是下面這個復制代碼時去除行號的小工具。
二、分析與設計 現在很多專業計算機技術網站提供的各種源代碼前,很多會帶有數字行號。我們將這些代碼復制下來運行前,要一行一行的去刪除前面的代碼,即浪費時間又容易出錯。如果有一個程序能快速、正確的去除掉代碼前的行號,無疑可以節省我們的很多時間(當然我寫這個程序花了大概有10幾個小時,不過正所謂“磨刀不誤砍柴工”嘛:)。 網上代碼前的行號排列大都比較有規律,多數采取如下形式: 1. abc 2. def ……………… 或 1 abc 2 def ……………… 以及[1]、1:、(1)等。 因此,要去除行號,首先就是要查找到每行的開頭數字及前后分割符號,然后替換掉他們。根據這個思路,很容易寫出如下的基本程序框架: 第1步:讀取全部n行代碼到一個字符串,然后將其轉換為包含n個子字符串的數組(或列表); 第2步:對于每一個子字符串,從左至右開始查找每個字符,如果找到一個或多個連續的、可轉換為整數的字符,就刪除其左側(包含數字自身位置)的全部字符,并用剩余部分生成一個新字符串。 第3步:如果新字符串左側有空白或:.])等分割符號,就去除掉它們,再用剩余部分生成一個新字符串。 第4步:將所有處理過的字符串順序連接起來,得到一個字符串,返回處理行號后的源代碼。
三、初步的實現——字符串替換 由于Python語言提供了良好的字符串操作功能,因此很快可以寫出一個初步的版本: #代碼1
# -*- coding: utf-8 -*-
def CutLineNum(inStr): #用def關鍵字聲明函數,注意后邊加冒號??? multiStr = inStr.splitlines(1) #將多行文本拆分為文本列表
??? outStr = u''
??? for singleStr in multiStr: #循環用for in的結構,后邊也加冒號
??????? singleStr = singleStr.lstrip() #去除左側空白
??????? i=0?#迭代算子
??????? for charStr in singleStr: #從左至右循環查找字符
??????????? if charStr.isdigit():#如果判斷是數字類型
??????????????? i += 1 #迭代算子加1
??????? ????elif i>0: #找到了一個非數字字符,而且前邊已有數字字符
??????????????? singleStr = singleStr[i:] #返回從該位置起的剩余字符
??????????????? break #跳出循環
??????????? else: #如果都沒有,說明是空行
??????????????? break #跳出循環
??????? outStr += singleStr #將所有行組成完整代碼
??? return outStr #返回 (注意,# -*- coding: utf-8 -*-是使用utf-8編碼,可以支持中文字符) 以上代碼實現了基本程序框架中的1-3步,第4步由于情況較復雜(有的行號后有分割符,有的沒有,而且空格數量也不一樣),所以暫時用以下函數手工處理: #代碼2
# -*- coding: utf-8 -*-
def CutLeftChar(inStr):??? outStr = u''
??? multiStr = inStr.splitlines(1)
??? for singleStr in multiStr:
??????? singleStr = singleStr[1:]
??????? outStr += singleStr
??? return outStr 這樣雖然苯拙一點,但至少解決了問題。 四、進一步優化——正則表達式替換
正則表達式(Regular Expression,簡稱Regex),是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。關于Python中正則的入門材料可以參考《正則表達式30分鐘入門教程》,?(不過我覺得30分鐘掌握正則表達式還是有困難的,為掌握它我還專門買了一本《精通正則表達式》)。正則表達式是一種處理文本的強大工具,刪除代碼行號對于它來講是小菜一疊。下面用正則表達式改寫代碼1和2,如下:
#代碼3import re #導入Python的正則表達式模塊def CutLineNum (inStr):??? multiStr = inStr.splitlines(1)??? outStr = u''p = re.compile(r'\D*\d+\s?[.|:|\]|\)]?\s?') #編譯正則表達式
??? for singleLine in multiLine:
??????? outStr += p.sub( '', singleLine,count = 1 ) #用空字符替換每行的第一個匹配上述正則表達式的字符串
??? return outStr #返回累加后的字符串? 以上代碼中的咖色部分就是一個Regex,它的含義是:0或多個非數字字符 + 至少1個數字字符 + 0或1個空白字符 + 0或1個分隔符(包括點、冒號、右圓/方括號,可添加其他分隔符) + 0或1個空白字符。 以上Regex符合大多數代碼前行號的規則,刪除行號就是用空字符替換掉每行代碼中第一個匹配該Regex的字符串(注意只能是第一個,因為程序里可能會存在abc1.open等情況,如果全部匹配就會誤刪代碼)。 五、繼續優化——采用函數編程 代碼3看起來還不夠簡潔,沒關系,Python是一種“準”函數編程(Functional Programming,FP)語言,做這種簡化代碼的事情最拿手。在這里,我用到了兩種函數編程手段——匿名函數(lambda)和一種高階函數(map),將代碼簡化至一行,如下: #代碼4import re #導入Python的正則表達式模塊outStr = ''.join(map(lambda x:re.compile(r'\D*\d+\s?[.|:|\]|\)]?\s?').sub( '', x,count = 1 ),inStr.splitlines(1)))) 這樣代碼就只優化到了一行了,是不是很簡潔呢?當然代碼的可讀性受到一定影響。所以函數編程不能濫用。(濫用的例子可以見我的文章《學習Python列表內涵:一行代碼搞定雙倍超立方數計算》)。函數編程是個稍微復雜點的問題,我覺得掌握與否均可,所以就不很詳細地去解釋上述代碼了。如果對Python的函數編程感興趣,可以參考《可愛的 Python:Python 中的函數編程》,很不錯的一篇文章。 六、完整的程序——添加I/O 完整的程序肯定少不了輸入輸出功能。對于這個去除復制代碼行號的小工具,我想到的輸入輸出方式一共有三種: 1、文件方式 將復制的代碼存為一個文本文件,然后用程序讀取它,去掉行號后在寫回文件。這種方法應該說是最不方便的,可以算一下自己需要點多少下鼠標……麻煩,所以我沒有實現它。關于Python的文件操作內容,網上有很多資料,可以搜索一下。 2、窗口方式 將復制的代碼粘貼到一個窗體的文本框里,然后點擊按鈕去除行號,再從文本框里把處理后的代碼復制出來。這是比較常規的做法,我分別用wxPython和PyQt4實現了這項功能,源代碼見http://www.cnblogs.com/。由于GUI編程是個比較復雜的問題,我就不詳細展開了,以后有時間再寫。 3、剪貼板方式 復制代碼到剪貼板后,啟動處理行號程序,直接處理剪貼板內的文本,然后再復制到其他地方。這是最方便的一種方法,而且由于不用構建GUI,代碼量也會很少。見下邊:
#代碼5
# -*- coding: utf-8 -*-
import win32clipboard as c #import包的時候,如果包名太長,可以用as起一個別名
import win32con as w #以上兩個包都是專門針對windows平臺的,注意
import re
c.OpenClipboard() #打開剪貼板
strList = c.GetClipboardData(w.CF_TEXT).splitlines(1) #讀取剪貼板內容到一個字符列表
c.EmptyClipboard() #清空剪貼板
c.SetClipboardData(w.CF_TEXT, ''.join(map(lambda x:re.compile \
??? (r'\D*\d+\s?[.|:|\]|\)]?\s?').sub( '', x,count = 1 ),strList )))
???? #將去處行號后的字符寫回剪貼板,此處用到代碼3
c.CloseClipboard() #關閉剪貼板 七、總結 以上就是我初學Python作的第一個程序,雖然很簡單,但在編寫這個程序的過程中,我學習到了: 1、Python的基本語法、類型與邏輯控制 2、Python的函數定以及函數編程方法 3、Python的圖形用戶界面設計(GUI) 4、正則表達式及其在Python中的應用 短時間內就可以學會這么多內容,足以說明Python的簡單易學,你也應該能體會到Python的強大吧。此外,在完成這個程序的過程中,我所用到的基本思路是: 1、由粗到細 先根據功能要求實現程序邏輯框架,然后用你所掌握的最基本方法實現初步版本,先讓程序能用。在此基礎上,再去看是否有繼續優化的可能(從代碼簡潔性或效率兩方面),逐步細化,這時候才是提高的過程。 2、自內而外 先實現核心算法,再添加外圍功能(I/O,GUI等)。有些編程初學者熱衷于用IDE去拖拉控件、美化界面等(當然這項工作也是必要的),沒有把更多精力集中到核心算法中去,這樣不利于真正學好一門語言。 當然這個程序還有很多需要完善的地方,歡迎提出你的意見或建議。
如果需要了解更多關于Python的內容,可訪問啄木鳥社區的《Python?資源索引》。
本文引用地址:http://blog.sciencenet.cn/home.php?mod=space&uid=404069&do=blog&id=297132?
轉載于:https://www.cnblogs.com/swjm119/archive/2012/01/18/2325280.html
總結
以上是生活随笔為你收集整理的第一个python去掉行号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL获取所有用户名,数据库名、所有表名
- 下一篇: 福特野马多少钱 探究福特野马的价格和配置