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

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

이 경우 목록이 있습니다.

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

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



답변

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

>>> 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()
''


답변

첫 번째 일치 만 필요한 경우 다음 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


답변

나는 함께 갈 것이다 :

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

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


답변

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

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

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


답변

넌 할 수있어:

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

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


답변

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

def return_first_match(text):
    result = re.findall('\d+',text)
    result = result[0] if result else ""
    return result


답변