Python實現的正規表示式文字查詢工具

2021-06-26 12:59:23 字數 4462 閱讀 7744

話說,

今天接到個任務

, 將公司的庫移植到

arm5

上(****,arm15

都有了,

你給哥整個

arm5….).一頓坑爹罵娘後

, 順利搞出

arm5

上的庫, 

開始測試

, 然後

bus error(

還不是親切的 

seqmenttation fault)

當然這篇部落格不是講bus error

的前因後果的

. 經過

各種排查

, 發現為此類**導致int n**** = *(int *)(****+42) (恩

,庫底層有很多這種讓人扯蛋的寫法

),但是這個庫在

arm7

和arm9,android和

windows

跑的都是很歡的

.(是的

,坑爹的

arm5

和指標強轉)

解決方案是memcpy,(

當然用結構體整體賦值那是最好的

,但是沒自動化測試工具的庫

,你是不敢動它的)

ok,之前都是吐槽

,問題來了

.這種指標強轉的寫法

, 分布之廣

,令人髮指

.且擺著各種姿勢在**深處等著

((int *) ,( int   *) , (int*) ).

普通的查詢方法肯定是歇菜的

, 不過

sourceinsight

還是很牛的

,有正規表示式查詢方法

,於是我屁顛屁顛的就把\(\s*int\s*\*+\s*\)輸進去了, 

結果「int *pclass, long omax)」這種貨色都給我匹配出來了(

小學沒畢業

, 不能這麼玩我吧

),各種測試

,感覺的

sourceinsight

自帶的正規表示式查詢方法跟我是尿不到乙個壺裡去了…

仔細想想,

這個正規表示式查詢方法實現起來其實蠻簡單的

,乙個遍歷目錄和檔案的遞迴方法

:iterdir , 對搜尋到的每個檔案

,呼叫方法

: searchfile,遍歷檔案裡的每一行

,對每一行呼叫方法

: checkline,判斷改行能否匹配使用者輸入的表示式

,如果匹配成功

, 呼叫方法:writelineinfo將結果寫入檔案.

於是,就寫了個

python指令碼,

**如下

:# -*- coding: gb2312 -*-

"""@author: vxpython

"""import os

import re

class searchclass(object):

def __init__(self , strpath = "" , strexpression=""):

super(self.__class__ , self).__init__()

self.stroutfilename = "result.log"

self.bskipnote = true

self.strpath = strpath

self.strexpression = strexpression

self.printinfo = none

self.initui()

#有時間用pyqt實現個gui介面

def initguiui(self):

pass

def initcuiprint(self , strinfo):

print strinfo

def initcuiui(self):

self.printinfo = self.initcuiprint

def initui(self):

self.initcuiui()

#遞迴遍歷目錄

def iterdir(self , path , depth):

#depth 遞迴深度

if os.path.isdir(path):

lipath = os.listdir(path)

nfilenum = len(lipath)

ncount = 1

for strchildpath in lipath:

strshow = "iter %s:process:%d / %d" % (path , ncount , nfilenum )

self.printinfo(strshow)

self.iterdir("/".join([path , strchildpath]) , depth+1)

os.system("cls") #linux "clear"

ncount += 1

elif os.path.isfile(path):

self.searchfile( path)

else :

self.printinfo('what **** file type...\n"%s" skip\n' % path )

def initwork(self):

self.strpath = raw_input("enter dir path==>")

self.strexpression = raw_input("enter expression==>")

self.printinfo('use "%s" in "%s"...\n' % (self.strexpression , self.strpath) )

try:

self.houtfile = open(self.stroutfilename , "w")

except exception , reason:

self.printinfo(reason)

def endwork(self):

try:

self.houtfile.close()

except exception , reason:

self.printinfo(reason)

self.printinfo("work over")

def runman(self):

while true:

self.initwork()

self.iterdir(self.strpath , 0)

self.endwork()

strres = raw_input("search again(y|y)==>")

if not strres.upper() == "y":

break;

#將使用者輸入的表示式開始匹配,是的,就是這麼簡單粗暴

def checkline(self , strline):

search = re.search(self.strexpression , strline)

if none == search : return false

else :

##跳過注釋行,其它語言的注釋自己看著辦,對於多行注釋暫時不實現了

if self.bskipnote:#看sourceinsight有這功能,實現個簡單的

match = re.match("\s*[/\*|//].*", strline)

if match != none:

return false

return true

def writelineinfo(self , strfilepath , strline , nlinecount):

try:

self.houtfile.write("%s:%d--%s" % (strfilepath , nlinecount , strline))

except exception , reason:

self.printinfo(reason)

def searchfile(self , strfilepath):

nlinecount = 0

with open(strfilepath , 'r') as hinfile:

for strline in hinfile:

nlinecount +=1

if self.checkline(strline):

self.writelineinfo(strfilepath , strline , nlinecount)

else:

pass

if __name__ == "__main__":

#clssearch = searchclass("d:\hello.txt" , "\(\s*int\s*\*+\s*\)")

clssearch = searchclass()

clssearch.runman()

然後, 繼續苦逼的跟bus error鬥爭吧...

正規表示式 火星文

之前在學習到正規表示式的時候,真的看了兩秒直接就跳過了,真的看到都怕,來自地球的我表示真的看不懂這個傳說中的火星文,但是,要想學習到更多的知識,我深知逃避是解決不了問題的,於是我硬著頭皮嘗試的去理解它,今天簡單記錄下來,以供以後來鄙視 正則表達是其實就是規則表示式,就是我們要找的條件翻譯成計算機能讀...

python正規表示式元字元 正規表示式

字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...

python正規表示式及使用正規表示式的例子

正規表示式 正則表達用來匹配字串 正規表示式匹配過程 正規表示式語法規則 匹配除換行 n 外的任意字串 abcabc 轉義字元,使後乙個字元改變原來的意思 a c a c 字符集,對應的位置可以是字符集中任意字元,字符集中的字元可以逐個列出,也可以給出範圍,如 abc 或 a c 第乙個字元如果是 ...