2013-02-06 2 views
1

잘못 입력 된 특정 사례를 찾을 수있는 정규식을 만들고 분자와 분모를 그룹으로 반환하려고합니다.논리 또는 그룹 정규식

이러한 경우에는 슬래시와 숫자 사이에 공백이 포함됩니다 (예 : 또는 1/ 2). 내가 더 관심이 있기 때문에 (나는 \d+

r'(\d) /(\d)|(\d)/ (\d)' 

사용하지 않는

: 나는 오히려 확인하기 위해 2 개 개의 별도 패턴이없는 것 때문에

나는, 정규식의 논리 또는 연산자를 사용 \d+도 마찬가지로 작동합니다).

문제는 두 번째 (1/ 2)의 경우와 일치 할 때 모든 그룹을 보면 (None, None, '1', '2')이 나오지만 2 개의 그룹 만 반환하는 정규식을 갖고 싶습니다. 그룹을 ('1', '2')하고 싶습니다. 이것이 가능한가?

편집 : 나는 또한 그것을 반환 할 것 같은 그룹 ('1', '2')의 경우 1/2에 대한,하지만 1/2 같은 잘 형성 분수 아무것도를 캡처하지합니다.

+0

무엇입니까'1/2'와'1/2'에 필요한 출력? –

+0

좋은 지적, 업데이트 된 질문. – beardc

답변

3

(\d)(?: /|/ | /)(\d)해야하며 잘못 입력 된 분수 만 반환해야합니다. no-capture 그룹의 사용에 주목하십시오.

편집 : 아래 주석으로 업데이트되었습니다.

+0

첫 번째 비 캡처 그룹은 무엇을합니까? 두 개의 비 - 캡쳐에 대해'| '작업을 수행하면됩니까? – beardc

+0

Naveed의 코멘트에 대한 응답으로이 질문을 업데이트했지만 이것이 내가가는 방법이라고 생각합니다. (단,'1/2'의 경우를 추가합니다. 즉'(\ d) (? :(?: /) | (? : /) | (?: /)) (\ d)'). 업데이트 할 수 있으면 받아 들일 것입니다. – beardc

+0

적어도 내부 그룹을 제거하십시오 :'(\ d) (? :/|/| /) (\ d)'. –

3

그냥 (\d)\s*/\s*(\d)을 사용하면 어떨까요? 당신은 항상 두 그룹이됩니다

그 방법 :

>>> import re 
>>> regex = r'(\d)\s*/\s*(\d)' 
>>> re.findall(regex, '1/2') 
[('1', '2')] 
>>> re.findall(regex, '1 /2') 
[('1', '2')] 
>>> re.findall(regex, '1/ 2') 
[('1', '2')] 
>>> re.findall(regex, '1/2') 
[('1', '2')] 
>>> 
+0

나는 보편성 때문에 이것을 좋아한다. 불행히도 그것은 두 번 문제가되지 않을 것이지만, 내가하고있는 모든 정규식의 내 응용 프로그램에 추가 시작 대체를 할 때 다른 대답만큼 느린 ... – beardc