我是Python和Python RE的新手。Python正則表達式匹配字符串選項
我想爲ARM彙編代碼做一個解析器。我想打的正則表達式匹配條件分支指令可能是:
beq, bne, blt, bgt
我試過形式
'b[eq|ne|lt|gt]'
的正則表達式但這並不匹配。有人可以幫助我嗎?
我是Python和Python RE的新手。Python正則表達式匹配字符串選項
我想爲ARM彙編代碼做一個解析器。我想打的正則表達式匹配條件分支指令可能是:
beq, bne, blt, bgt
我試過形式
'b[eq|ne|lt|gt]'
的正則表達式但這並不匹配。有人可以幫助我嗎?
請嘗試以下方式: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
你應該用括號FO [R選項,而不是方括號:
b(eq|ne|lt|gt)
而且你通常會想要一個非捕獲組:
b(?:eq|ne|lt|gt)
而且你還可以把它多一點優化過:
b(?:eq|ne|[lg]t)
方括號將被理解爲任何字符或字符的範圍。所以[eq|ne|lt|gt]
有效手段之一e
,q
,|
,n
,e
一個(再次,因此它成爲多餘的),等等。
非捕獲組有什麼意義? – bozdoz
@bozdoz:你可能不想捕捉,說「eq」作爲一個組。 – geoffspear
@bozdoz捕獲組會捕獲一小塊虛擬內存(因爲它存儲捕獲),而非捕獲組則不會。然後它會像'你想讓它吃不必要的虛擬內存嗎?' :) – Jerry
[工作我的機器上(http://ideone.com/RhpAHr)。 – Kevin
@Kevin如果你打印比賽,你會看到只有'被匹配':)否則,嚴格來說,是的,它匹配。 – Jerry
好的,修訂版:「在我的機器上不起作用,但展現與您報告的不同的故障模式」。我得到一個不太正確的比賽; OP完全沒有匹配。 – Kevin