2017-11-16 4 views
-1

나는 JPEG 이미지의 정보를 조작하기 위해 파이썬 프로그램을 작성 중이다. 그러나 JPEG 이미지에 사용 된 바이트 마커 코드를 찾기 위해 정규식을 가져 오는 데 문제가 있습니다.JPEG 바이 스트림 마커를 정규식으로 파싱

예 : 이미지 마커의 시작은 \xFF\xD8이고 이미지 마커의 끝은 \xFF\xD9입니다. 사용하려고 시도한 패턴은 rb'\xFF\xD8(.+?)\xFF\xD9'입니다. 성공하지 못했습니다. 바이트 배열의 특정 바이트 표시 자 사이에있는 모든 것을 찾으려면 어떻게해야합니까?

+0

백 슬래시를 다른 백 슬래시로 이스케이프 처리해야합니다. – ctwheels

+0

정규식의'.'은 기본적으로 개행 문자와 일치하지 않습니다. JPEG 파일에는 실수로 일부 개행 문자가 포함될 가능성이 큽니다. '.DOTALL'을 flags 매개 변수 (거의 모든 regex 메소드에서 사용 가능)로 전달하여'.'가 어떤 바이트와도 일치하도록 만듭니다. – jasonharper

+0

감사합니다. 사실이 사실을 알고있었습니다. 일치하는 실제 코드는 다음과 같습니다. 'matches = re.findall (pattern, data, flags = re.DOTALL)' –

답변

0

문자열의 'r'접두어는 "백 슬래시를 무시합니다"라고 말합니다. 따라서 무시됩니다.

이 'F'가

는 R과의 일부 이중 백 슬래시를 제거 'X', 'F', '\'는 말 그대로 처음 네 문자가 포함 된 문자열을 찾고 r에 의미하고, 이진 문자를 표현하기 위해 이스케이프 처리하지 않고 정규 표현식.

+0

고맙습니다. r을 제거하거나 각 바이트 앞에 다른 백 슬래시를 추가하는 것이 더 좋을까요? –

+0

바이너리 문자를 나타 내기 위해 이스케이프가 아닌 정규 표현식의 일부인 r 및 이중 슬래시를 모두 제거하십시오. 대답을 편집하여 대답을 완성합니다. –

+1

'r' 접두사는 백 슬래시가 파이썬의 문자열 리터럴 구문에 의해 이스케이프로 해석되지 않는다는 것을 의미합니다.하지만 이는 정규 표현식 컴파일러에서 해석 할 수 있음을 의미합니다 (16 진수 값의 경우 '\ x'는 regex 컴파일러는 구현하지 않습니다). 거의 항상'r' 접두어를 정규 표현식으로 사용하고 싶습니다. – jasonharper