2016-07-23 2 views
3

입력 문자열의 경우 {(P)으로 시작하고 (P)}으로 끝나는 텍스트를 일치시키고 싶습니다. 중간 부분 만 일치 시키려고합니다. 이 문제를 해결하기 위해 하나의 정규 표현식을 작성할 수 있을지 궁금한가요?Python에서 정규식 일치 문제가 발생했습니다

예를 들어 다음 예제에서 입력 문자열의 경우 안녕하세요 부분을 검색하고 싶습니다. Python 2.7 사용하기.

python {(P)hello world(P)} java 

답변

4

당신은 {\(P\)(.*)\(P\)}을 시도하고 {(P) 사이 (P)} 모든 것을 캡처 패턴에서 괄호를 사용할 수 있습니다

import re 
str1 = "python {(P)£1,073,142.68(P)} java" 
str2 = re.findall(r'{\(P\)(.*)\(P\)}', str1)[0] 

str2 
# '\xc2\xa31,073,142.68' 

print str2 
# £1,073,142.68 
+1

을 감사합니다 Psidom, 솔루션에 투표하십시오. 두 개의'(P)'사이에 ASCII가 있으면 성공적으로 출력 될 수 있음을 발견했습니다. 하지만 중간에 유니 코드 문자가 있다면 출력 (print re.findall (r '{\ (P \) (. *) \ (P \)}', "python {(P) hello world P)} java ")'to output)는'[ '\ xe5 \ x8e \]'와 같이 이상하게 보일 것입니다. print를 사용하여 출력 할 때 유니 코드 문자로 다시 변환 할 생각은 없습니까? –

+1

유니 코드 문자는 ASCII 문자와 동일한 방식으로 캡처됩니다. 실제로 무엇이 보이는지보기 위해 멋지게 인쇄하면됩니다. 이를 반영하여 답변을 업데이트하겠습니다. – Psidom

+0

멋진 Psidom, 답장을 기다리면서 투표하세요. –

2

당신에게 : 또한 예를 들어, 유니 코드 문자와 일치

import re 
re.findall(r'{\(P\)(.*)\(P\)}', "python {(P)hello world(P)} java") 

# ['hello world'] 

.* 정규식 없이도이 작업을 수행 할 수 있습니다.

s = 'python {(P)hello world(P)} java' 
r = s.split('(P)')[1] 
print(r) 
# 'hello world' 
+1

'{'와'}'요구 사항은 어떨까요?!** 예제 **에 대한 귀하의 코드는 작동하지만 질문에 대답하지 않습니다. –

+0

예, 저는 @OhadEytan과 동일한 느낌을 가지고 있습니다. –

+0

@OhadEytan이 제기 한 문제를 해결할 수 있다면 Moses에게 답장과 투표를 해줘서 고맙습니다. –

3

텍스트가 앞뒤에 시작 및 끝 태그 뒤에 오는 경우에만 긍정적 인 검색 기능을 사용하여 일치하는지 확인할 수 있습니다. 예를 들어 다음 패턴을 사용할 수 있습니다.

(?<={\(P\)).*?(?=\(P\)}) 

demo을 참조하십시오.

  • (?<={\(P\)) - 일치가 앞에 {(P) 앞에 와야한다는 것을 나타내는 뒤 표정 문구.
  • .*? - 시작 태그와 종료 태그 사이의 모든 텍스트와 일치합니다. ?은 별을 게으르게 만듭니다 (즉 욕심이 들지 않음). 이는 가능한 한 일치하지 않는다는 것을 의미합니다.
  • (?=\(P\)}) - 일치하는 뒤에 (P)}이 와야한다는 진술을 나타내는 미리보기 표현입니다. 그것은 가치가 무엇인지에 대한

는 게으른 패턴은 기술적으로 덜 효율적이다, 그래서 당신이 경기에는 ( 문자가 없을 것이라는 점을 알고 있다면, 부정 문자 클래스를 사용하는 것이 좋을 것이다 :

(?<={\(P\))[^(]*(?=\(P\)}) 
+0

감사합니다. 스티브, 투표하세요. 왜 '?'기호로 시작해야합니까? –

+1

그것은 둘러보기를위한 구문입니다. '(? <= ...)'는 긍정적 인 표정을 만듭니다. '(? = ...)'는 긍정적 인 look-ahead를 만든다. 둘러보기 (look-around expressions)를 사용하면 실제로 일치 항목에 실제로 포함하지 않고 특정 항목이 일치 전 또는 후에 있어야한다고 명시 할 수 있습니다. –

+0

쿨, 고마워 스티브, 투표 해. 두 개의'(P)'사이에 ASCII가 있으면 성공적으로 출력 될 수 있음을 발견했습니다. 그러나 중간에 유니 코드 문자가 있으면 출력 (print re.findall (r '(? <= {\ (P \)). *? (? = \ (P \)})', utf -8-string-to-pass)'출력은'[ '\ xe5 \ x8e \]'와 같이 이상하게 보일 것입니다. 출력을 사용하여 출력 할 때 유니 코드 문자로 다시 변환 할 생각은 없습니까? –