2014-06-26 44 views
2

我是Python和Python RE的新手。Python正則表達式匹配字符串選項

我想爲ARM彙編代碼做一個解析器。我想打的正則表達式匹配條件分支指令可能是:

beq, bne, blt, bgt 

我試過形式

'b[eq|ne|lt|gt]' 

的正則表達式但這並不匹配。有人可以幫助我嗎?

+0

[工作我的機器上(http://ideone.com/RhpAHr)。 – Kevin

+0

@Kevin如果你打印比賽,你會看到只有'被匹配':)否則,嚴格來說,是的,它匹配。 – Jerry

+0

好的,修訂版:「在我的機器上不起作用,但展現與您報告的不同的故障模式」。我得到一個不太正確的比賽; OP完全沒有匹配。 – Kevin

回答

1

請嘗試以下方式:b(?:eq|ne|lt|gt)

  • []字符集:將只匹配在方括號中任意一個字符。您可以使用元字符-,如指定一個字符範圍:[a-e],甚至通過使用元字符^,例如否定的表達:[^aeiou]

  • ()捕捉parentesis:用於創建取號分組部&組中,可以通過使用禁用此功能下面炭設置捕獲parentesis內?:,例如(?:)

如上所述,你應該使用capturing parentesis需要匹配多個字符,所以,這就是使用brackets的模式與您的字符串不匹配的原因。

請注意,使用non capturing parentesis是爲了不保存任何正在匹配的數據,但是您可以刪除元字符?:以捕獲組。

由於蟒蛇執行Perl兼容的正則表達式引擎,您可以使用named captured groups & numbered backreferences,使用它的主要優點,是讓你的表達容易維護,閱讀,編輯等

如:

  • (?P<opcode>b(?:eq|ne|lt|gt)) - 將捕獲你的模式b(?:eq|ne|lt|gt)的將比賽拖入反向引用名opcode
5

你應該用括號FO [R選項,而不是方括號:

b(eq|ne|lt|gt) 

而且你通常會想要一個非捕獲組:

b(?:eq|ne|lt|gt) 

而且你還可以把它多一點優化過:

b(?:eq|ne|[lg]t) 

方括號將被理解爲任何字符或字符的範圍。所以[eq|ne|lt|gt]有效手段之一eq|ne一個(再次,因此它成爲多餘的),等等。

+0

非捕獲組有什麼意義? – bozdoz

+0

@bozdoz:你可能不想捕捉,說「eq」作爲一個組。 – geoffspear

+1

@bozdoz捕獲組會捕獲一小塊虛擬內存(因爲它存儲捕獲),而非捕獲組則不會。然後它會像'你想讓它吃不必要的虛擬內存嗎?' :) – Jerry

相關問題