정규식을 기반으로 목록의 문자열을 필터링하고 싶습니다.
보다 나은 것이 [x for x in list if r.match(x)]
있습니까?
답변:
다음을 사용하여 Python 3.x에서 반복기 를 만들 거나 Python 2.x에서 목록 을 만들 수 있습니다 .
filter(r.match, list)
Python 3.x 반복기 를 목록으로 변환하려면 간단히 캐스트하십시오. list(filter(..))
.
filter
버전은 완벽하게 명확하고 소음이 훨씬 적습니다.
r.match
여기?
r.match
는 주어진 문자열에 적용될 때 정규식이 r
해당 문자열과 일치 하는지 여부를 찾는 메서드입니다 (그렇다면 해당 일치 개체를 반환하지만 결과가 진실인지 여부 만 신경 쓰기 때문에이 경우에는 중요하지 않습니다).
전체 예제 (Python 3) :
Python 2.x의 경우 아래 참고 사항을 살펴보십시오.
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)
인쇄물:
['cat', 'wildcat', 'thundercat']
노트 :
Python 2.x 개발자의 경우 filter
이미 목록을 반환합니다. Python 3.xfilter
에서는 반복자를 반환하도록 변경되었으므로 list
(잘 출력되는 것을 보려면) 로 변환해야 합니다.
str
하기 때문에 filter
... 목록 어쨌든, 아무 소용에 반환
print(list(newlist))
나print([i for i in newlist])
Regex를 먼저 컴파일하지 않고 이렇게하려면 lambda
함수를 사용하십시오 . 예를 들면 다음과 같습니다.
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))
print(filtered_values)
보고:
['123', '234']
filter()
callable
첫 번째 인수를 그대로 취하고 해당 콜 러블이 '진정한'값을 반환 한 목록을 반환합니다.