2012-08-03 3 views
2

작은 따옴표로 묶지 않으면 문자열을 바꾸기 위해 정규 표현식을 작성하려고합니다. 예를 들어 나는 다음과 같은 문자열에 XXX에 FOO를 교체하려면 :작은 따옴표로 묶지 않으면 문자열을 바꿀 Python 정규식

string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '" 

원하는 출력은 다음과 같습니다

output = "' FOO ' abc 123 ' def FOO ghi 345 ' XXX '' XXX ' lmno 678 FOO '" 

나의 현재 정규식은 다음과 같습니다

myregex = re.compile("(?<!')+(FOO)(?!')+", re.IGNORECASE) 

나는 생각 둘러보기 연산자를 사용하는 방법을 모르지만 정규식이 너무 복잡합니다. D

도와 주실 수 있습니까?

+0

예를 들어 잘못 생각한 것 같습니다. 첫 번째 "abc 123"이 XXX로 대체되지 않는 이유는 무엇입니까? –

+0

예제가 나에게 맞는 것처럼 보이지만 첫 번째 FOO는 작은 따옴표로 묶여 건너 뜁니다. – daveoncode

+0

첫 번째 FOO에서 동의합니다. 그러나 abc를 시작하는 비트가/외부 /라는 것을 의미하지는 않습니다. 그렇다면 결과는 다음과 같아야합니다. " ''FOO 'XXX'FOO GHI 345 'XXX' 'XXX'lmno 678 FOO '". 옳은? –

답변

2

는 그것을 할 수있는 방법은 다음과 같습니다

import re 

def replace_FOO(m): 
    if m.group(1) is None: 
     return m.group() 

    return m.group().replace("FOO", "XXX") 

string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '" 

output = re.sub(r"'[^']*'|([^']*)", replace_FOO, string) 

print(string) 
print(output) 

[편집]

re.sub 기능을 대체하거나 문자열 템플릿 또는 함수로 받아 들일 것이다. 바꾸기가 함수 인 경우 일치 항목을 찾을 때마다 함수를 호출하고 일치 개체를 전달한 다음 반환 된 값 (문자열이어야 함)을 대체 문자열로 사용합니다. 이 검색으로 현재 위치에 '이 있다면 패턴 자체로

, 그것은에 일치합니다 및 다음 '를 포함, 그렇지 않으면 최대 일치하는 것입니다하지만 다음 ' 또는 말을 제외하고 문자열.

각 일치에 대체 함수가 호출되어 적절한 결과가 반환됩니다.

사실, 지금 생각해 보면 그룹을 전혀 사용할 필요가 없습니다. 대신 다음 작업을 수행 할 수 있습니다.

def replace_FOO(m): 
    if m.group().startswith("'"): 
     return m.group().replace("FOO", "XXX") 

    return m.group() 

string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '" 

output = re.sub(r"'[^']*'|[^']+", replace_FOO, string) 
+0

나를 위해 작동하지 않는다, 나는 'FOO'를 얻는다. FOO ghi 345 '' 'lmno 678 FOO''출력 ("XXX"가 사라짐) –

+0

그것은 나를 위해 예상대로 작동한다 (Python 2.7.1) 고마워! Python과 regex 초보자이기 때문에 코드를 설명 할 수 있다면 매우 유용 할 것입니다. P – daveoncode

+1

@daveoncode : 답변을 편집했습니다. – MRAB

1

가변 길이 lookbehind 없이는 어렵습니다. 나는 파이썬 정규식을 지원하는지 모르겠습니다.

사용이 정규식 : 어쨌든, 간단한 해결책은 다음과 같다 (?:[^'\s]\s*)(FOO)(?:\s*[^'\s])

첫 번째 캡처 그룹이 올바른 결과를 반환해야합니다.

예를 들어, 다음과 같이 공백이있는 따옴표를 사용하는 경우 항상 고정 길이 검색 머리글 (?<=[^'\s]\)FOO(?=\s*[^'\s])을 사용하면 원하는 것과 정확하게 일치 할 수 있습니다. 여기

+1

Python의 표준 정규 표현식 라이브러리 're'는 가변 길이 lookbehind를 지원하지 않지만, http://pypi.python.org/pypi/regex에있는 PyPI에 대한 대체 정규 표현식 라이브러리가 있습니다. – MRAB

관련 문제