[python]正則表達式的學習---處理鋼筋文字

最近在寫一個dynamo,希望可以給對梁鋼筋進行驗算,避免強條。

正好趁此機會學習一下正則。下面分享一下簡單正則的學習經驗。

前提紀要,關於梁鋼筋的處理可以參考前面兩篇文章的思路,本文是接著在梁圖Revit下出圖後整體對梁鋼筋進行驗算:

[BIM]關於繪製梁平法施工圖的改進想法

[BIM]梁平法施工圖的改進2-AutoCAD下樑數據的讀取

在此再次強烈推薦jupyter!本文正則部分的python代碼是在我坐火車途中用iPad寫的,jupyter在雲平台上部署好了以後,可以在任何有網路而且可以使用瀏覽器的設備上編譯運行。

jupyter部署可以參考:

[jupyter]在雲服務上部署jupyter notebook

jupyter下跟dynamo的python好像有一些不同,dy中好像必須放在前面,否則會報錯。

其他方面直接把jupyter下的代碼拷貝到dy里,然後修改一下輸入輸出就可以直接運行了。

本文也是自己的一點很淺學習經歷,都是比較簡單的表達式。下面開始正文:

正則表達式也是不斷發展起來的一個引擎,能夠快速地對字元串進行描述和分析。我們這次主要通過正則表達式進行對鋼筋文字進行匹配、分割,最終得到一個數組能夠詳細表達出結構梁的配筋情況,以方便下一步的驗算工作。

首先還是看這張圖,能滿足我們大部分的需求:

Python支持的正則表達式元字元和語法

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="425"lefttopj="725 5/2"righttopj="528/225"btmj="725 (-2)2/5"

先處理5f28/2f25的情況

split的應用

這時候需要使用split來進行切割

split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):

split的用法

如圖,我們將縱筋按排數切成了一個數組。

接下來,我們將"2f22+2f20"里的鋼筋數量和鋼筋直徑提取出來。

這時候需要使用findall方法

findall用法

其他就是需要通過數組操作換成需要的數組型式。

比如:

5f25/2f22變換成:

[[25, 25, 25, 25, 25], [22, 22]]

方便整理鋼筋數據。這些都是數組方面的操作,就不複述了。

其他代碼:

jupyter運行結果

最終得到需要的結果,拷貝到dynamo的python模塊里就可以用了。

當然,寫的比較匆忙,很多東西也沒注意,比如str本身作為函數名,不適合當變數。

最終輸出結果都是字元串,忘記轉成int了等等,不要在意。

dynamo鋼筋驗算腳本

根據輸出結果,結合規範進行驗算,基本都是數組運算,不在複述。

最終梁驗算出的結果

最後把結果寫在注釋欄,再做一個過濾器將有「bug」的梁替換成黃色,方便檢查修改。

就完成了梁整體驗算的工作。

推薦閱讀:

香港的建築行業與國內有什麼不同嗎?

TAG:BIM | AutoDeskRevit | 结构工程 |