정규식 : 목록에서 검색


87

정규식을 기반으로 목록의 문자열을 필터링하고 싶습니다.

보다 나은 것이 [x for x in list if r.match(x)]있습니까?

답변:


114

다음을 사용하여 Python 3.x에서 반복기 를 만들 거나 Python 2.x에서 목록 을 만들 수 있습니다 .

filter(r.match, list)

Python 3.x 반복기 를 목록으로 변환하려면 간단히 캐스트하십시오. list(filter(..)).


2
실제로, 목록 이해는 일반적으로 필터, 감소, 람다 등과 같은 기능적 구성보다 선호됩니다.
Ivo van der Wijk

37
@Ivo : 그들은 일반적으로 더 명확하고 종종 더 간결하기 때문에 일반적으로 선호됩니다. 그러나이 경우 filter버전은 완벽하게 명확하고 소음이 훨씬 적습니다.
sepp2k

9
무엇 r.match여기?
rbatt

2
@rbatt r.match는 주어진 문자열에 적용될 때 정규식이 r해당 문자열과 일치 하는지 여부를 찾는 메서드입니다 (그렇다면 해당 일치 개체를 반환하지만 결과가 진실인지 여부 만 신경 쓰기 때문에이 경우에는 중요하지 않습니다).
sepp2k

167

전체 예제 (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(잘 출력되는 것을 보려면) 로 변환해야 합니다.

Python 3 코드 예제
Python 2.x 코드 예제


4
안녕하세요, 위의 코드를 실행하면 <filter object at 0x1057acda0>뭘 잘못하고 있나요?

1
파이썬 문서 (python 2.7.12)에 따르면 : docs.python.org/2/library/functions.html#filter 필터는 객체가 아닌 목록을 반환합니다. 다음 코드도 확인할 수 있습니다. repl.it/X3G/5786 (그냥 실행)
Mercury

1
감사합니다. Mac에서 Python 3.5.2를 사용하고 있습니다. 나는 당신의 링크를 시도했습니다. 물론 작동하지만 왜 그 메시지를 받는지 확실하지 않습니다. 나는 심지어 제거 str하기 때문에 filter... 목록 어쨌든, 아무 소용에 반환

4
@joshua 당신은 아마 지금 쯤에서이 문제를 생각하지만 시도했습니다 print(list(newlist))print([i for i in newlist])
제임스 드레이퍼

1
이것은 엄청나게 어렵습니다. 이것이 R이 우수한 이유입니다. 간단히 grep (pattern, vector_of_names)
MadmanLee

1

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첫 번째 인수를 그대로 취하고 해당 콜 러블이 '진정한'값을 반환 한 목록을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.