2017-10-02 1 views
0

, 나는 다음과 같은 문제가 발생했습니다 unsigned을 지정하는 임의의 순서로,정규식에서 OR 연산자 (|)를 사용하여 정렬되지 않은 부분 문자열을 일치시킬 필요가 있습니까? C 프로그래밍 언어 파이썬에서 어휘 분석을 실행하는 경우

정수 유형이 u (U)로 종료 할 수 l (L) 수정 또는 둘 또는 long 정수 유형입니다. 우리가 여기에서 볼 수 있듯이

'''Dec''' 
    r'\b([1-9][0-9]*)[uU]?[lL]?\b|\b([1-9][0-9]*)[lL][uU]\b' 
    '''Oct''' 
    r'\b0[0-7]*[uU]?[lL]?\b|\b0[0-7]*[lL][uU]\b' 
    '''hex''' 
    r'\b0[xX][a-fA-F0-9]+[uU]?[lL]?|\b0[xX][a-fA-F0-9]+[lL]?[uU]?' 

은 모두 순서 ulul 수정에 맞게 :

는, 내가 쓴 정규식은 다음과 지금이 유형과 일치하고 토큰을 검사하는 정규 표현식을 쓰고 있어요

입니다 또는 lu (대문자 또는 소문자), OR 연산자 |을 정규 표현식에 써야하고이 두 조건을 처리하기 위해 다른 부분을 반복해야합니다.

두 개의 순서가없는 부분을 반복하지 않고 일치시키는 정규식을 작성하는 간단한 방법이 있습니까?

답변

1

당신은 지금처럼 만 패턴의 에서 그룹을 배치 할 수 있습니다 : (blank), l, u, luul :

([lL][uU]|[uU]?[lL]?) 

이 다섯 가지 사례를 설명합니다. 예를 들어

, 원래의 패턴 :

r'\b([1-9][0-9]*)[uU]?[lL]?\b|\b([1-9][0-9]*)[lL][uU]\b' 

가된다 : 마찬가지로

'''Dec''' 
re.compile('\b([1-9][0-9]*)(lu|u?l?)\b', re.IGNORECASE) 

: 당신은 대소 문자를 구분하지 정규식을 사용하여이 작업을 더 간단하게 할 수

r'\b([1-9][0-9]*)([lL][uU]|[uU]?[lL]?)\b' 

주 다른 숫자 형식의 경우 :

+0

실제로 괄호를 사용하는 것이 훨씬 더 우아하지만, 정렬되지 않은 일치에 OR 연산자 (|)가 필요한지 궁금합니다. 범용적이고 보편적이기 위해서는 서로 다른 패턴을 일치시키는 두 가지 순서로 정규식을 작성해야합니까? –

+0

정규식은 "정렬되지 않은 일치"를 실제로 지원하지 않습니다. 그건 그들이 근본적으로 일하는 방식이 아닙니다. 앞을 내다 보면서 이것을 달성 할 수는 있지만 그 결과는 오히려 추한 것입니다. '(? = [^ l] * l? [^ l] * \ b) (? = [^ u] * u? [^ u]]와 같이 대체 할 수 있습니다. * \ b) [lu] *'. –

+0

'(lu | u? l?)'은 솔직히 말해서 문제를 해결할 수있는 아주 간단하고 우아한 해결책이라고 생각합니다! –

관련 문제