첫 번째 정규식과 일치하는 문자열 반환


90

정규식의 첫 번째 일치를 얻고 싶습니다.

이 경우 목록이 있습니다.

text = 'aa33bbb44'
re.findall('\d+',text)

[ '33', '44']

목록의 첫 번째 요소를 추출 할 수 있습니다.

text = 'aa33bbb44'
re.findall('\d+',text)[0]

'33'

하지만 일치하는 항목이 하나 이상있는 경우에만 작동합니다. 그렇지 않으면 오류가 발생합니다.

text = 'aazzzbbb'
re.findall('\d+',text)[0]

IndexError : 목록 색인이 범위를 벗어났습니다.

이 경우 함수를 정의 할 수 있습니다.

def return_first_match(text):
    try:
        result = re.findall('\d+',text)[0]
    except Exception, IndexError:
        result = ''
    return result

새로운 함수를 정의하지 않고 그 결과를 얻을 수있는 방법이 있습니까?


나를 위해 받아 들여진 대답은 작동하지 않았습니다. 배열 인덱스 액세스를 제거하고 len(re.findAll)==0대신 check를 사용해야 했습니다.
Vishal

답변:


104

''다음을 추가하여 정규식에 기본값을 포함 할 수 있습니다 |$.

>>> re.findall('\d+|$', 'aa33bbb44')[0]
'33'
>>> re.findall('\d+|$', 'aazzzbbb')[0]
''
>>> re.findall('\d+|$', '')[0]
''

re.search다른 사람 이 지적한 것과 도 작동 합니다.

>>> re.search('\d+|$', 'aa33bbb44').group()
'33'
>>> re.search('\d+|$', 'aazzzbbb').group()
''
>>> re.search('\d+|$', '').group()
''

좋습니다. search / .group은 findall / [0]보다 어떤 이점이 있습니까?
Luis Ramon Ramirez Rodriguez

6
@LuisRamonRamirezRodriguez 글쎄, 그것은 일치하는 것을 발견하자마자 멈출 수 있고, 나머지 텍스트를 처리 할 필요가 없으며 모든 일치를 저장할 필요가 없습니다. 따라서 더 효율적입니다. 또한 @TimPeters가 말했듯 문자 그대로 "원하는 것" 입니다. 그것은 당신이나 다른 누군가가 그것을 읽고 "왜 findall사용 되었는가 ?"라고 궁금해 할 때 이점이 될 수 있습니다. .
스테판 Pochmann

43

첫 번째 일치 만 필요한 경우 다음 re.search대신 사용하십시오 re.findall.

>>> m = re.search('\d+', 'aa33bbb44')
>>> m.group()
'33'
>>> m = re.search('\d+', 'aazzzbbb')
>>> m.group()
Traceback (most recent call last):
  File "<pyshell#281>", line 1, in <module>
    m.group()
AttributeError: 'NoneType' object has no attribute 'group'

그런 다음 다음 m과 같은 검사 조건으로 사용할 수 있습니다 .

>>> m = re.search('\d+', 'aa33bbb44')
>>> if m:
        print('First number found = {}'.format(m.group()))
    else:
        print('Not Found')


First number found = 33

12

나는 함께 갈 것이다 :

r = re.search("\d+", ch)
result = return r.group(0) if r else ""

re.search어쨌든 문자열에서 첫 번째 일치 만 검색하므로 findall.


7

당신은 전혀 사용해서는 안됩니다 .findall()- .search()당신이 원하는 것입니다. 가장 왼쪽에있는 일치 항목을 찾습니다 (또는 None일치하는 항목이없는 경우 반환 ).

m = re.search(pattern, text)
result = m.group(0) if m else ""

그것을 함수에 넣을지는 당신에게 달려 있습니다. 그건 이상한 일치하는 항목이없는 경우처럼 아무것도 내장되지 않은 이유입니다, 빈 문자열을 반환 할 수 있습니다. 그것은 불가능에 대한 혼란을 얻을 여부를 .search()자신의 발견에 일치 (이 반환 None은하지 않은 경우 또는 SRE_Match객체 만약 그렇다면).


3

넌 할 수있어:

x = re.findall('\d+', text)
result = x[0] if len(x) > 0 else ''

귀하의 질문은 정규식과 정확히 관련이 없습니다. 오히려 배열에서 요소가없는 경우 어떻게 안전하게 찾을 수 있습니까?


2
여기서 'len (x)> 0'을 단순히 'x'로 바꿉니다.
울프 ASLAK

1

더 많은 양의 입력 데이터에 더 많은 비용이 들기 때문에 원하는 부분이 포함되지 않은 경우 더 나은 성능을 발휘할 수 있습니다.

def return_first_match(text):
    result = re.findall('\d+',text)
    result = result[0] if result else ""
    return result
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.