[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