2013-01-10 4 views
0

일치정규 표현식 나는 다음과 같은 형식이 문자열을 가지고 문제

some_string = ",,, XXX ,,, XXX ,,, XXX ,,, XXX ,,, XXX ,,, XXX, ,, " 는이 내가 XXX 내의 특정 용어를 검색 할

f를라는 텍스트 파일의 내용이

노트 (의 그 용어는 '실리콘'라고하자)가 xxx는 모든 수 다른 줄을 제외하고는 다른 특수 문자 (메타 문자 포함)를 포함 할 수 있습니다.

(210)

하지만이는 형식으로되어 결과를 반환하기 때문에 작동하지 않습니다 [ "XXX ,,, XXX ,,, XXX ,,, XXX ,,, 실리콘", "XXX ,,, XXX를 ,,, xxx ,,, xxsiliconxx "]하지만 반환하려면 ["silicon ","xxsiliconxx "]

내가 뭘 잘못하고 있니?

답변

1

는 다음과 같은 정규 표현식을 시도해보십시오

(?<=,{3})(?:(?!,{3}).)*?silicon.*?(?=,{3}) 

예 : 나는 xxx의 내용은, 그냥 세 개의 연속 쉼표를 쉼표를 포함 할 수 있습니다 또는 필드를 끝낼 것이라고 가정하고

>>> s = ',,,xxx,,,silicon,,,xxx,,,xxsiliconxx,,,xxx' 
>>> re.findall(r'(?<=,{3})(?:(?!,{3}).)*?silicon.*?(?=,{3})', s) 
['silicon', 'xxsiliconxx'] 

. xxx 섹션의 내용은 어떤 쉼표를 포함 할 수없는 경우, 당신은 대신를 사용할 수 있습니다 :

(?<=,{3})[^,\r\n]*?silicon.*?(?=,{3}) 

작동하지 않는 현재의 접근 방식도 .*? 불구하고 가능한 한 적은 수의 문자와 일치하려고한다는 것입니다 이유, 경기는 가능한 한 일찍 시작됩니다. 예를 들어, 정규 표현식 a*?b은 전체 문자열 "aaaab"과 일치합니다. 정규식이 시작 위치로 나아갈 수있는 유일한시기는 정규식이 일치하지 않는 경우이며 ,,,.*?과 일치 할 수 있기 때문에 일치 항목은 항상 문자열 시작 부분 또는 이전 일치 부분 바로부터 시작됩니다.

lookbehind 및 내다

은 기본적으로 re.findall()이 일치하는 항목을 중복 반환하지 않습니다 의견 JaredC에 의해 제기 된 문제를 해결하는 데 사용됩니다, 그래서 당신은 앞과 경기의 일부가 될하지 ,,, 후행해야합니다.

+0

이 코드는',,, xxx ,,, silicon ,,, xxsiliconxx ,,, xxx' 문자열에는 적용되지 않습니다.하지만 OP가 해결해야 할 또 다른 문제 일 수 있습니다. – JaredC

+0

@ JaredC 좋은 점, 그 문제를 해결하기위한 lookbehind/lookahead가 추가되었습니다. –

+0

고마워요! 그게 효과가있는 것처럼 보입니다. – Crust3

관련 문제