rreplace-문자열에서 마지막으로 나타나는 표현식을 바꾸는 방법?


139

파이썬에서 문자열을 바꾸는 빠른 방법이 있습니까?하지만 처음부터 시작하는 replace것이 아니라 처음부터 시작 합니까? 예를 들면 다음과 같습니다.

>>> def rreplace(old, new, occurrence)
>>>     ... # Code to replace the last occurrences of old by new

>>> '<div><div>Hello</div></div>'.rreplace('</div>','</bad>',1)
>>> '<div><div>Hello</div></bad>'

5
그런 간단한 문제에 대한 복잡한 해결책으로 판단하면 좋은 질문입니다.
저스틴 Ardini

3
이 답변에 추가되는 데 9 년 (!)이 걸린 우아한 답변이 아래에 있습니다. 아래로 스크롤하여 찾으십시오.
John D

답변:


196
>>> def rreplace(s, old, new, occurrence):
...  li = s.rsplit(old, occurrence)
...  return new.join(li)
... 
>>> s
'1232425'
>>> rreplace(s, '2', ' ', 2)
'123 4 5'
>>> rreplace(s, '2', ' ', 3)
'1 3 4 5'
>>> rreplace(s, '2', ' ', 4)
'1 3 4 5'
>>> rreplace(s, '2', ' ', 0)
'1232425'

9
아주 좋아요! 내 프로그램의 일반적인 문자열에서 마지막으로 나타나는 표현식 (> 500 자)을 대체하는 비과학적인 벤치 마크에서 솔루션은 Alex의 솔루션보다 3 배, Mark의 솔루션보다 4 배 빠릅니다. 답변 해 주셔서 감사합니다!
Barthelemy

2
고마워요. 이 .replace메소드는 세 번째 선택적 인수 'count'를 사용하여 처음 n 개의 발생을 대체하도록 지시합니다. -1과 비슷하지만 불행히도 그렇지 않을 경우 직관적이지 않았으므로 솔루션이 필요합니다.
카 다몬

17

나는 이것이 가장 효율적인 방법이라고 생각하지는 않지만 간단한 방법입니다. 문제가되는 모든 문자열을 str.replace반대로하고 뒤집은 문자열을 사용하여 일반적인 대체를 수행 한 다음 결과를 올바른 방향으로 되돌립니다.

>>> def rreplace(s, old, new, count):
...     return (s[::-1].replace(old[::-1], new[::-1], count))[::-1]
...
>>> rreplace('<div><div>Hello</div></div>', '</div>', '</bad>', 1)
'<div><div>Hello</div></bad>'

10

다음은 하나의 라이너입니다.

result = new.join(s.rsplit(old, maxreplace))

모든 하위 문자열 oldnew 로 대체 string s 사본을 리턴합니다 . 첫 번째 maxreplace 발생이 대체됩니다.

그리고이 사용중인 전체 예 :

s = 'mississipi'
old = 'iss'
new = 'XXX'
maxreplace = 1

result = new.join(s.rsplit(old, maxreplace))
>>> result
'missXXXipi'

1
좋은! line = "".join(line.rsplit(",", 1))나중에 패딩 공간을 유지하면서 줄에서 후행 쉼표를 제거하는 데 사용 되었습니다.
손자

9

문자열을 바꾸고 첫 번째 발생을 바꾸고 다시 뒤집으십시오.

mystr = "Remove last occurrence of a BAD word. This is a last BAD word."

removal = "BAD"
reverse_removal = removal[::-1]

replacement = "GOOD"
reverse_replacement = replacement[::-1]

newstr = mystr[::-1].replace(reverse_removal, reverse_replacement, 1)[::-1]
print ("mystr:", mystr)
print ("newstr:", newstr)

산출:

mystr: Remove last occurence of a BAD word. This is a last BAD word.
newstr: Remove last occurence of a BAD word. This is a last GOOD word.

5

'오래된'문자열에 특수 문자가 포함되어 있지 않다면 정규 표현식으로 수행 할 수 있습니다.

In [44]: s = '<div><div>Hello</div></div>'

In [45]: import re

In [46]: re.sub(r'(.*)</div>', r'\1</bad>', s)
Out[46]: '<div><div>Hello</div></bad>'

1

문제에 대한 재귀 적 해결책은 다음과 같습니다.

def rreplace(s, old, new, occurence = 1):

    if occurence == 0:
        return s

    left, found, right = s.rpartition(old)

    if found == "":
        return right
    else:
        return rreplace(left, old, new, occurence - 1) + new + right
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.