2012-04-25 67 views
3

我使用美麗的湯來識別特定標籤及其內容。內容是html鏈接,我想提取這些標籤的文本。美麗的湯和正則表達式

問題在於文本是根據特定模式由不同的數字組成的。我只對諸如「61993J0417」和「61991CJ0316」等數字感興趣,當數字中間有一個「J」和「CJ」時,我需要正則表達式來匹配這兩個數字。

我已經使用這個代碼來實現這一點:

soup.find_all(text=re.compile('[6][1-2][0-9]{3}[J]|[CJ][0-9]{4}')) 

湯變量是特定的標籤的內容。此代碼適用於10個案例中的9個。但是,當我在其中一個源文件上運行此腳本時,它還匹配諸如「51987PC0716」之類的數字。

我不明白爲什麼所以我會求助於你。

+0

在特定的文件,這個表達式提出了四個錯誤匹配:51987PC0716,51992PC0405,51992PC0405-C和51992PC0405-A09。 如果我將正則表達式更改爲''^ [6] [1-2] [0-9] {3} [J] | [CJ] [0-9] {4} $'',它只會產生兩個錯誤和匹配51987PC0716和51992PC0405。 – A2D2 2012-04-25 06:58:23

回答

3

您還沒有指定|適用於;默認情況下,它是整個正則表達式,這意味着你已經要求要麼

[6][1-2][0-9]{3}[J] 

(這是一回事6[12][0-9]{3}J

CJ[0-9]{4} 

[CJ],意思是「無論是C或J「)。用括號指定的替代品是什麼:

^6[12][0-9]{3}(J|CJ)[0-9]{4}$ 

哪個比較好寫

^6[12][0-9]{3}C?J[0-9]{4}$ 
+0

這完美的作品!非常感謝你! – A2D2 2012-04-25 07:12:15

3

IIUC,你的字符串裏總是有一個「J」。 因此,使其成爲強制性的,並使用問號使「C」成爲可選項。 喜歡的東西:

re.compile('6[1-2][0-9]{3}C?J[0-9]{4}') 

我沒有測試過這一點,但你也許可以從這裏自己繼續。