2012-09-20 127 views
2

我需要檢查一個變量是否爲正則表達式匹配對象。檢查一個變量是否爲SRE_Match

print(type(m))回報類似的東西:<_sre.SRE_Match object at 0x000000000345BE68>

,但是當我輸入_sre並嘗試執行type(m) is SRE_Match異常NameError: name 'SRE_Match' is not defined提高。

+2

通常你只能從功能匹配的對象,要麼返回'None'或匹配對象......有啥只是測試'None'的問題? – nneonneo

+0

我有一個字典,其中包含不同類型的值,並根據值類型需要執行不同的操作。 –

+2

難看的數據結構與難看的代碼攜手並進 –

回答

4

您可以在程序的開始做

SRE_MATCH_TYPE = type(re.match("", "")) 

,然後

type(m) is SRE_MATCH_TYPE 
每次

要作出比較。

+0

是的,我試過這種方法,它工作正常但它看起來很髒)) –

+0

是嗎?除了你只需要運行一次的行之外,它不是特別多於你的'type(m)是SRE_Match'解決方案的字符。當你嘗試做一些不尋常的事情時(把正則表達式結果混合到一個包含許多其他類型值的字典中),你的代碼有時也需要有點不同尋常。 –

+0

「髒」並不意味着「更多的代碼行」或「不尋常的」)) –

0

你可以做這樣的事情

isinstance(m, type(re.match("",""))) 

通常沒有必要檢查匹配對象的類型,所以沒有人已經不屑於做一個很好的辦法做到這一點

+0

這將在* every *'isinstance'查詢上進行匹配... – nneonneo

+0

@nneonneo,如果您經常使用它,將其分配給變量確實不難了 –

0

由於type(m)回報打印的表示我會用:

repr(type(m)) == "<type '_sre.SRE_Match'>" 

,所以你不必導入_sre模塊,並沒有做任何額外match電話。

這是爲Python 2.它似乎比在Python 3中類型(m)的結果是不同的,像<_sre.SRE_Match object at 0x000000000345BE68>。如果是這樣,我想你可以使用:

repr(type(m)).startswith("<_sre.SRE_Match") 

或類似的東西(我沒有在手的Python 3的解釋,現在,這樣的答案,這部分可能不準確)。

+0

不幸的是,不能移植到Python 3: 'repr(type(m))==「」' – nneonneo

+0

問題涉及到Python 3嗎? – Vicent

+0

是的,他使用'print(type(m))'(只是猜測。) – nneonneo

2

樁上,因爲有辦法解決這個問題一大堆:

def is_match_obj(m): 
    t = type(m) 
    return (t.__module__, t.__name__) == ('_sre', 'SRE_Match')