2013-08-08 3 views
2

파일 목록이 있는데 'test_'로 시작하고 '.py'로 끝나는 파일 만 유지하려고합니다. 정규식에서 'test_'및 '.py'내부 텍스트 만 반환하기를 원합니다. 나는 .pyc 파일을 포함하고 싶지 않다.Python - 주어진 텍스트로 시작하고 끝나는 문자열에 대한 정규식 검색

>>>filename = 'test_foo.py' 
>>>re.search(r'(?<=test_).+(?=\.py)', filename).group() 
foo.py 

을하지만 여전히 확장을 반환하고 (I 원하지 않는) 확장 '된 .pyc'수 :

나는 노력했다. 나는 전체 문자열을 소비하는 '+'라고 확신합니다.

이 대체로 작동하지만 정규식 솔루션을 선호하는 것 :

>>>filename = 'test_foo.py' 
>>>result = filename.startswith('test_') and filename.endswith('.py') 
>>>result = result.replace('test_', '').replace('.py', '') 
>>>print result 
foo 
+1

이 왜 정규식 솔루션을 선호? 나는 당신의 후퇴가 실제로 더 나은 접근법이라고 생각합니다. – arshajii

+0

http://regex101.com/r/qU7iS2에서 테스트해볼 수 있습니다. 그것은 잘 작동하는 것 같다, 어쩌면 그것을 잘못 받고'그룹()'방법? – brianmearns

+0

@ Keyser : 정중히 동의 : http://regex101.com/r/lR3lK7 – brianmearns

답변

5

문제는 당신의 패턴이 test_에 의해 .py 이전 후 오는 모든 문자열과 일치하지만 그것을 제한하지 않는다는 것입니다 test_ 또는 .py 앞에 다른 문자가 없습니다.

시작 (^)과 끝 ($) anchors을 사용해야합니다. 또한 . 문자를 이스케이프하는 것을 잊지 마세요. 이것

(?<=^test_).+(?=\.py$) 
+0

그랬어! 나는 그 선구자 뒤에 '$'를 넣으려고했으나 효과가 없었다. 그래도 그래. 감사!추신 : 예, 나는 '.'을 피하는 것을 잊었습니다. 내 질문에. – zalpha314

+0

'^'는 긍정적 인 시각을 필요로하지 않습니다. 맞습니까? iCodez가 제안한 것만 큼 필요한 것 같습니다. – keyser

+0

@Keyser 나는 그것이 있다고 생각한다. 그것없이 패턴은'some_test_foo.py'와 일치 할 것입니다. 물론, 당신은 아무런 보지 않고 그것을 할 수 있습니다. –

1

봐 :이 패턴을 시도

출력
import re 

files = [ 
"test_1.py", 
"Test.py", 
"test.pyc", 
"test.py", 
"script.py"] 

print [x for x in files if re.search("^test_.*py$", x)] 

:

['test_1.py'] 
+0

내가 찾던 내용이 아닙니다. 나는 'test_'와 '.py'를 원하지 않기 때문에 Lookahead와 Lookbehind를 유지해야한다. 이 질문에 대한 수정을했습니다. – zalpha314

+0

@ zalpha314 - 오, 음, 그 전에 게시했습니다. – iCodez

+0

예; 내 사과. – zalpha314

관련 문제