regex, 일치하지 않는 경우 처리 사례에 대해 첫 번째 일치가 있는 문자열 반환
저는 정규리그 첫 경기를 치르고 싶습니다.
다음과 같은 경우에는 목록을 가지고 있습니다.
text = 'aa33bbb44'
re.findall('\d+',text)
# ['33', '44']
목록의 첫 번째 요소를 추출할 수 있었습니다.
text = 'aa33bbb44'
re.findall('\d+',text)[0]
# '33'
하지만 그건 적어도 한 명의 일치자가 있을 때만 가능해요, 그렇지 않을 경우엔IndexError
:
text = 'aazzzbbb'
re.findall('\d+',text)[0]
# IndexError: list index out of range
이 경우 함수를 정의할 수 있습니다.
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.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 = 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
object(목적어)를 선택합니다.
다음을 수행할 수 있습니다.
x = re.findall('\d+', text)
result = x[0] if len(x) > 0 else ''
당신의 질문은 regex와 정확하게 관련이 없다는 것에 유의하세요.오히려 배열에서 요소가 없을 경우 안전하게 요소를 찾는 방법이 있습니다.
비용이 더 많이 든다는 점을 제외하고는 더 많은 양의 입력 데이터가 원하는 조각을 포함하지 않는 경우에는 이 방법이 더 효과적일 수 있습니다.
def return_first_match(text):
result = re.findall('\d+',text)
result = result[0] if result else ""
return result
결과를 변수에 할당한 다음 변수를 반복합니다.
text = 'aa33bbb44'
result=re.findall('\d+',text)
for item in result:
print(item)
할당식(PEP572) 사용:
text = 'aa33bbb44'
r = m.group() if (m:=re.search(r'\d+',text)) is not None else ''
와 함께re.findall
, 출력을 반복기로 변환할 수 있습니다.iter()
부름next()
첫 번째 결과를 얻기 위해 그 위에.next()
는 기본값(예: )이기 때문에 이 작업에 특히 유용합니다.''
)를 전달할 수 있습니다. 반복기가 비어 있으면 기본값이 반환됩니다. 즉 일치하는 항목이 없는 경우 기본값이 반환됩니다.
next(iter(re.findall('\d+', 'aa33bbb44')), '') # '33'
next(iter(re.findall('\d+', 'aazzzbbb')), '') # ''
이쯤 되면.next()
와 함께 사용할 수 있습니다.re.finditer
그 일을 위해서도 말입니다.
next(re.finditer('\d+', 'aa33bbb44'), [''])[0] # '33'
next(re.finditer('\d+', 'aazzzbbb'), [''])[0] # ''
당신은 또한 바다코끼리 오퍼레이터를 사용할 수 있습니다.re.search
외줄용으로
m[0] if (m:=re.search('\d+', 'aa33bbb44')) else '' # '33'
m[0] if (m:=re.search('\d+', 'aazzzbbb')) else '' # ''
이 특정 작업에 대해, 반대하는 논쟁.re.findall
성능이고 실제로 큰 줄의 경우 격차가 큽니다.매치가 여러 개일 경우,re.findall
다씬다씬다씬n 보다 훨씬 느립니다.re.search
아니면re.finditer
1.1하지만 경기가 없는 경우에는re.search
re.finditer
가장 빠른..2
1 100만 문자와 10만 일치하는 문자열의 타이밍입니다.
text = 'aabbbccc11'*100_000
%timeit m[0] if (m:=re.search('\d+', text)) else ''
# 1.94 µs ± 192 ns per loop (mean ± std. dev. of 10 runs, 100,000 loops each)
%timeit next(re.finditer('\d+', text), [''])[0]
# 2.38 µs ± 122 ns per loop (mean ± std. dev. of 10 runs, 100,000 loops each)
%timeit next(iter(re.findall('\d+', text)), '')
# 59 ms ± 8.65 ms per loop (mean ± std. dev. of 10 runs, 10 loops each)
%timeit re.search('\d+|$', text)[0]
# 2.32 µs ± 300 ns per loop (mean ± std. dev. of 10 runs, 100,000 loops each)
%timeit re.findall('\d+|$', text)[0]
# 82.7 ms ± 1.64 ms per loop (mean ± std. dev. of 10 runs, 10 loops each)
2 일치하지 않는 백만 문자의 문자열에 대한 타이밍입니다.
text = 'aabbbcccdd'*100000
%timeit m[0] if (m:=re.search('\d+', text)) else ''
# 26.3 ms ± 662 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
%timeit next(re.finditer('\d+', text), [''])[0]
# 26 ms ± 195 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
%timeit next(iter(re.findall('\d+', text)), '')
# 26.2 ms ± 615 µs per loop (mean ± std. dev. of 10 runs, 100 loops each)
%timeit re.search('\d+|$', text)[0]
# 72.9 ms ± 14.1 ms per loop (mean ± std. dev. of 10 runs, 100 loops each)
%timeit re.findall('\d+|$', text)[0]
# 67.8 ms ± 2.38 ms per loop (mean ± std. dev. of 10 runs, 100 loops each)
언급URL : https://stackoverflow.com/questions/38579725/return-string-with-first-match-for-a-regex-handling-case-where-there-is-no-matc
'programing' 카테고리의 다른 글
XML에서 특성 값 가져오기 (0) | 2023.09.14 |
---|---|
log와 symlog의 차이점은 무엇입니까? (0) | 2023.09.09 |
사용자를 변경하려면 어떻게 해야 합니까?(cmd, mariadb) (0) | 2023.09.09 |
도커 로그인: '스터브가 잘못된 데이터를 수신했습니다' 자격 증명을 저장하는 중 오류가 발생했습니다. (0) | 2023.09.09 |
오류: 스키마 유효성 검사에 실패하고 다음 오류가 발생했습니다. 데이터 경로 ""에 추가 속성이 없어야 합니다(프로젝트). (0) | 2023.09.09 |