[python]正則表達式的學習---處理鋼筋文字
最近在寫一個dynamo,希望可以給對梁鋼筋進行驗算,避免強條。
正好趁此機會學習一下正則。下面分享一下簡單正則的學習經驗。
前提紀要,關於梁鋼筋的處理可以參考前面兩篇文章的思路,本文是接著在梁圖Revit下出圖後整體對梁鋼筋進行驗算:
[BIM]關於繪製梁平法施工圖的改進想法
[BIM]梁平法施工圖的改進2-AutoCAD下樑數據的讀取
在此再次強烈推薦jupyter!本文正則部分的python代碼是在我坐火車途中用iPad寫的,jupyter在雲平台上部署好了以後,可以在任何有網路而且可以使用瀏覽器的設備上編譯運行。
jupyter部署可以參考:
[jupyter]在雲服務上部署jupyter notebook
jupyter下跟dynamo的python好像有一些不同,dy中好像必須放在前面,否則會報錯。
其他方面直接把jupyter下的代碼拷貝到dy里,然後修改一下輸入輸出就可以直接運行了。
本文也是自己的一點很淺學習經歷,都是比較簡單的表達式。下面開始正文:
正則表達式也是不斷發展起來的一個引擎,能夠快速地對字元串進行描述和分析。我們這次主要通過正則表達式進行對鋼筋文字進行匹配、分割,最終得到一個數組能夠詳細表達出結構梁的配筋情況,以方便下一步的驗算工作。
首先還是看這張圖,能滿足我們大部分的需求:
1.鋼筋文字轉換
本文的鋼筋符號使用的是探索者CAD下打開的鋼筋符號,而非替代符或者「Revit字體」的$&等替代符。這樣的好處是,在裝有探索者CAD軟體的環境下,CAD和Revit都能正常顯示,在CAD中讀取的符號不用替換就能在Revit中正常顯示,但在其他環境下,比如瀏覽器、dynamo中都顯示為。
一級鋼、二級鋼、三級鋼、四級鋼分別根據字典被轉換成了a、d、f、e。
先不管這個子程序里正則是如何使用,我們先從下面箍筋的處理看起。
2.箍筋文字的處理
對於字元串「f10@100/200(4)」,我們需要提取其中的幾個信息並行成一個數組[f、10、100、200、4]分別代表[鋼筋符號、箍筋直徑、加密區間距、非加密區間距、箍筋肢數]
search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):
如圖所示,鋼筋符號在替換後只會出現a、d、f、e,所以我們使用『[...]』寫如可能的字元,使用『|』代表匹配分隔兩邊的任意一個表達式。"^"表示在這裡,這個字元只會匹配開頭出現。假如"^"出現在方括弧內:"[^...]",則又表示是排除某字元。
例,[0-9]代表數字,[a-z]代表小寫字母。
"d"是字符集,同"[0-9]"。
字符集的用法可參考文章開頭的圖片。
下面來匹配鋼筋直徑:
如果要匹配某符號之後之前的文字,則需要使用"(?<=...)"和"(?=...)"
這樣就能夠匹配"[a|d|f|e]"和"@"之間的鋼筋文字了。
然後是"?","*","+"的用法
*:匹配前一個字元0次或無限次
+:匹配前一個字元1次或無限次
?:匹配前一個字元0次或1次
在本例中,我們可以使用『(.+?)』來匹配
另外,需要學習轉義符的用法,比如""、"*"、"("等本身有意義,但我們需要匹配這些字元的時候需要使用轉義,匹配"("需要使用"("。
例如本例中匹配"(4)"中的肢數則可以這樣寫:
"(?<=()[d](?=))"
3.縱筋文字的處理:
分為幾種情況:
topj="425"lefttopj="725 5/2"righttopj="528/225"btmj="725 (-2)2/5"
先處理5f28/2f25的情況
split的應用
這時候需要使用split來進行切割
split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):
如圖,我們將縱筋按排數切成了一個數組。
接下來,我們將"2f22+2f20"里的鋼筋數量和鋼筋直徑提取出來。
這時候需要使用findall方法
其他就是需要通過數組操作換成需要的數組型式。
比如:
5f25/2f22變換成:
[[25, 25, 25, 25, 25], [22, 22]]
方便整理鋼筋數據。這些都是數組方面的操作,就不複述了。
其他代碼:
最終得到需要的結果,拷貝到dynamo的python模塊里就可以用了。
當然,寫的比較匆忙,很多東西也沒注意,比如str本身作為函數名,不適合當變數。
最終輸出結果都是字元串,忘記轉成int了等等,不要在意。
根據輸出結果,結合規範進行驗算,基本都是數組運算,不在複述。
最後把結果寫在注釋欄,再做一個過濾器將有「bug」的梁替換成黃色,方便檢查修改。
就完成了梁整體驗算的工作。
推薦閱讀:
TAG:BIM | AutoDeskRevit | 结构工程 |