2012-02-20 4 views
1

변경하고 싶지만 특정 줄에만있는 텍스트를 구문 분석합니다.일치하는 표현식 내의 특정 그룹 만 바꾸기

나는 관심있는 라인이면 전체 라인을 포착하는 정규 표현식 패턴을 가지고 있으며 표현식 내에서 내가 실제로 변경하고자하는 것을 기억하고 있습니다.

일치하는 표현식 내에서 특정 그룹 만 변경하고 전체 표현식을 바꾸지 않고 전체 행을 대체 할 수 있기를 바랍니다. 예를 들어

:

내가 가진 텍스트 파일이 있습니다

This is a completely silly example. 
something something "this should be replaced" bla. 
more uninteresting stuff 

을 그리고 정규식이 : 나는 두 번째 줄을 잡아 다음 pattern = '.*("[^"]*").*'

,하지만 난 단지 대체 할 것 줄 전체가 아닌 일치하는 그룹 인 "this should be replaced". (그래서 re.sub(pattern, replacement, string)를 사용하여 작업을하지 않습니다.

사전에 감사!

답변

2

이전과 너무 일치 표현식 매치 길이 제로의 문자열 후

r'"[^"]+"' 

귀하의 .* 잘못 무엇 때문에 . 당신은

re.sub(r'"[^"]+"', 'DEF', 'abc"def"ghi') 
# returns 'abcDEFghi' 

전혀 필요하지 않습니다 및 예제 텍스트에 발생합니다 :

,
'This is a completely silly example.\nsomething something DEF bla.\nmore uninteresting stuff 
2

eumiro 답은이 경우에 가장 좋지만, 완전성을 위해 사전, 내부 및 게시 텍스트를 좀 더 복잡한 처리를 수행해야하는 경우 다음과 같이 여러 그룹을 간단히 사용할 수 있습니다.

'([^"]*)("[^"]*")(.*)' 
:

'(.*)("[^"]*")(.*)' 

당신이 사전 부분에 "금지하는 것이 좋습니다,

또한 (첫 번째 그룹은 세 번째 텍스트 후, 당신은 그들과 함께 좋아하는 것을 수행하기 전에 텍스트를 제공)

+0

select에서는 대체 문자를 사용할 수 없습니다. – Moondra

1

re.matchre.search은 "일치 개체"를 반환합니다. (파이썬 문서 참조). RE에서 그룹 3을 바꾸려면 시작/끝 인덱스를 꺼내서 하위 문자열을 직접 바꿉니다.

mobj = re.match(pattern, line) 
start = mobj.start(3) 
end = mobj.end(3) 
line = line[:start] + replacement + line[end:] 
관련 문제