2012-09-20 7 views
2

변수가 정규식 일치 개체인지 확인해야합니다.변수가 SRE_Match인지 확인하십시오.

print(type(m)) 반환 그런 일 : <_sre.SRE_Match object at 0x000000000345BE68>

하지만 _sre를 가져오고 예외 NameError: name 'SRE_Match' is not defined가 발생 type(m) is SRE_Match을 실행하려고 할 때.

+2

는 당신은 단지 하나 반환'None' 또는 일치하는 개체는 ... 그래서 무슨 함수에서 일치하는 개체의 얻을 'None'을 테스트하는 데 문제가 있습니까? – nneonneo

+0

다른 유형의 값을 가진 사전이 있으며 값 유형에 따라 다른 작업을 수행해야합니다. –

+2

추악한 코드와 함께 추악한 데이터 구조가 생깁니다 –

답변

4

당신은 프로그램 시작시

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

을 할 수있는 다음

type(m) is SRE_MATCH_TYPE 

때마다 당신은 비교를 만들고 싶어.

+0

예,이 접근법을 시도하고 작동합니다 그러나 그것은 더러워 보입니다)) –

+0

그것입니까? 반드시 한 번만 실행해야하는 라인을 제외하고,'type (m) is SRE_Match' 해결책보다 더 이상 특성이 없습니다. 그리고 다른 무언가를하려고 할 때 (다른 많은 유형의 값을 가진 사전에서 정규 표현식 결과를 섞어서) 코드를 다루는 코드는 때로는 좀 특이해야합니다. –

+0

"더티 (dirty)"는 "더 많은 코드 줄"또는 "비정상적인"을 의미하지는 않습니다.) –

0

당신이

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

처럼 뭔가를 할 수는 보통 일치하는 개체의 유형을 확인 할 필요가 없기 때문에 아무도 그것을

+0

그게 * 모든'isinstance' 쿼리에 일치 할 것입니다 ... – nneonneo

+0

@nneonneo, 자주 변수를 사용하면 변수에 할당하기가 어렵지 않습니다. –

0

으로 type(m) 리턴을 할 수있는 좋은 방법을 귀찮게했다 프린트 가능 표현은 내가 사용합니다 :

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

그래서 당신이 _sre 모듈을 가져올 필요가 없으며 추가 할 필요가 없습니다 match 전화.

파이썬 2 용입니다. 파이썬 3보다 유형 (m)의 결과가 다르다 (<_sre.SRE_Match object at 0x000000000345BE68>과 같은 것).

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

또는 유사한 무언가가 (내가 지금 손에 파이썬 3 통역을 가지고 있지 않기 때문에 답이 부분은 정확하지 않을 수 있습니다.) : 그렇다면 당신이 사용할 수있는 가정합니다. 문제를 해결하는 방법의 전체 무리가 이후

+0

슬프게도, 파이썬 3에 이식 할 수 없습니다 : 'repr (type (m)) == ""' – nneonneo

+0

질문이 파이썬 3을 언급합니까? – Vicent

+0

예, 그는'print (type (m))'을 사용합니다 (그냥 추측입니다.) – nneonneo

2

말뚝에, : 일반적으로

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