2012-07-10 4 views
-4

특정 텍스트 내에서 텍스트를 가져 오려면 어떻게해야합니까? 나는이 같은 텍스트가있는 경우 등이 :특정 텍스트의 텍스트 가져 오기?

'lololol \r asdfasdf r\ gfhfgr'

는 어떻게하면 'asdfasdf'를 반환 할 수 있습니다. 기본적으로 비트 '\r''r\' 사이의 텍스트를 가져 옵니까?

+4

무엇을 시도 했습니까? –

+0

@JonClements 나는 아무 것도 시도하지 않았다 ... 내가 가진 유일한 단서는 for 루프와 일부 조건문을 사용하고있다 ... 그리고 전혀 효율적이지 않다. –

답변

4

또 다른 재 솔루션, ['asdfasdf']

편집에

import re 

s = r'lololol \r asdfasdf r\ gfhfgr' 
pattern = re.compile('\\\\r (.*?) r\\\\') 

print pattern.findall(s) 

결과 :

음, 친구, 그게 네가 네가 원한대로 말한거야. 원하는 경우 사용할 수 있습니다

pattern = re.compile('\\\\r(.*?)r\\\\') 

대신 [' asdfasdf '] 줄 것입니다.

파이썬과 다시 구문 분석 문자열 때문에 '모든 슬래시'가 필요합니다. 슬래시는 \n (개행 문자)와 같은 이진 그래프의 이스케이프 문자로 사용됩니다. 따라서 슬래시를 나타 내기 위해서는 \\ 이합체 표를 사용해야합니다. 이것을 보려면 print('\\')을 시도하십시오.

그런 다음 문자열을 다시 자체 구문 집합 (숫자의 경우 \ d, 공백의 경우 \ s)에 대해 파싱하기 때문에 두 배로해야합니다. 따라서 '\\\\'을 입력하면, 파이썬은이 문자열을 두 개의 슬래시로 구성된 문자열 인 \\으로 해석합니다.이 슬래시는 구문 분석하여 하나의 문자 \을 찾고 있다고 생각합니다.

때로는 이렇게하지 않고 도망 갈 수 있습니다. '\m'과 같은 문자열이있는 경우, 후행 문자가 유효한 중첩 문자가 아니기 때문에 결과는 실제로 두 문자 문자열 \m (시도 print('\m'))입니다. \ r은 일종의 펑키입니다. 파이썬은 이것을 캐리지 리턴 자형 문자로 인식하지만 \ r은 \ r을 파이 그래프로 사용하지 않으므로 파이썬 '\ r'또는 '\\ r'둘 다 리터럴 문자열 '\ r'을 다시 찾습니다. 나는 double-double-slash를 선호하는데, 이것은 합법적 인 사인파가 아닌지에 대한 두 개의 분리 된 정의를 기억할 필요가 없다는 것을 의미합니다! 반면에 파이썬과 다시는 \ '를 작은 따옴표로 인식합니다 (print('\'')' 문자를 출력합니다). 따라서 두 개의 슬래시를 완전히 두 번 이스케이프 처리해야합니다. 그렇지 않으면 나머지 부분이 끈??" 오류 ('문자열이 종료되지 않음').

다른 방법으로는 원시 문자열 (r'abc')을 입력하는 것입니다. 이 문자열에서 파이 그래프를 파싱하지 말라는 것을 알려주지 만 여전히 패턴은 같아야합니다.

pattern = re.compile(r'\\r(.*?)r\\') 
+2

:) - 잠재적으로 캡처 그룹을 비 욕심 많은 것으로 만들지 만 OP가 내가 추측하는 것을 결정할 수 있습니다. –

+0

@JonClements : 좋은 생각, 그렇게 해왔습니다. –

+0

다른 것 사이에 공백이 없으면 작동하지 않습니다. 또한, 왜 그렇게 많은 '\'? 설명해 줄 수 있니? 또는 무언가에 연결? –

2

파이썬에서 정규 표현식을 사용할 수 있습니다.

>>> import re 
>>> s = 'lololol \r asdfasdf r\ gfhfgr' 
>>> e = re.search(r'\r (?P<boxflux>.*) r\\', s) 
>>> e.group('boxflux') 
'asdfasdf' 

boxflux.com

+0

AttributeError : 'NoneType'객체에 'group'속성이 없습니다. –

+0

+1 명명 된 그룹. –