문자열에서 마지막 부분 문자열 찾기, 대체


104

따라서 동일한 형식의 긴 문자열 목록이 있고 마지막 "."을 찾고 싶습니다. 문자를 입력하고 ".-"로 바꿉니다. rfind를 사용해 보았지만 제대로 활용하지 못하는 것 같습니다.


답변:


163

이것은 그것을해야한다

old_string = "this is going to have a full stop. some written sstuff!"
k = old_string.rfind(".")
new_string = old_string[:k] + ". - " + old_string[k+1:]

1
정말 감사합니다. 잠시 공부해야 겠네요 ... 이건 슬라이스를 활용하는 거죠?
Adam Magyar 2013 년

@AdamMagyar 예, container [a : b]는 컨테이너의 최대 b-1 인덱스에서 슬라이스합니다. 'a'가 생략되면 기본값은 0입니다. 'b'가 생략되면 기본값은 len (container)입니다. 더하기 연산자는 연결됩니다. 지적한대로 rfind 함수는 대체 작업이 발생해야하는 인덱스를 반환합니다.
Aditya Sihag 2013 년

26

오른쪽에서 교체하려면 :

def replace_right(source, target, replacement, replacements=None):
    return replacement.join(source.rsplit(target, replacements))

사용:

>>> replace_right("asd.asd.asd.", ".", ". -", 1)
'asd.asd.asd. -'

1
나는이 솔루션을 확실히 좋아하지만 replacements=None매개 변수가 생략되면 함수가 오류를 제공하기 때문에 매개 변수가있는 것 같습니다 (Python 2.7에서 시도). 기본값을 제거하거나 -1 (무제한 교체)로 설정하거나 더 나은 방법 replacements=1(OP가 원하는대로이 특정 기능에 대한 기본 동작이어야한다고 생각 함)을 제안합니다. 문서 에 따르면 이 매개 변수는 선택 사항이지만 주어진 경우 정수 여야합니다.
remarkov

누군가가 이것을 위해 한 줄짜리를 원하는 경우 : ". -".join("asd.asd.asd.".rsplit(".", 1)). 당신이하고있는 일은 1 번의 발생에 대해 오른쪽에서 문자열 분할을 수행하고 교체를 사용하여 문자열을 다시 결합하는 것입니다.
bsplosion

14

정규식을 사용합니다.

import re
new_list = [re.sub(r"\.(?=[^.]*$)", r". - ", s) for s in old_list]

2
이것은 점이 전혀 없으면 작동하는 유일한 대답입니다. 그래도 \.(?=[^.]*$)
예견을

6

하나의 라이너는 다음과 같습니다.

str=str[::-1].replace(".",".-",1)[::-1]


1
이것은 잘못된 것 입니다. 현을 뒤집고 교체 한 다음 다시 뒤집습니다. 당신은 .replace반전 된 문자열에서하고 있습니다. 전달 된 두 문자열 replace도 역전되어야합니다. 그렇지 않으면 두 번째로 문자열을 뒤집을 때 방금 삽입 한 문자가 거꾸로됩니다. 하나의 문자를 하나의 문자로 바꾸는 경우에만 사용할 수 있으며, 나중에 누군가가 변경해야하고 왜 단어가 sdrawkcab으로 작성되었는지 궁금해 할 경우를 대비하여 코드에 넣지 않을 것입니다.
Boris

1

오른쪽에서 처음 나오는 단어를 대체하는 아래 기능을 사용할 수 있습니다.

def replace_from_right(text: str, original_text: str, new_text: str) -> str:
    """ Replace first occurrence of original_text by new_text. """
    return text[::-1].replace(original_text[::-1], new_text[::-1], 1)[::-1]

0
a = "A long string with a . in the middle ending with ."

# 문자열의 마지막 발생 인덱스를 찾으려면 우리의 경우 # with 마지막 발생의 인덱스를 찾습니다.

index = a.rfind("with") 

# 인덱스가 0부터 시작하므로 결과는 44가됩니다.


-1

순진한 접근 방식 :

a = "A long string with a . in the middle ending with ."
fchar = '.'
rchar = '. -'
a[::-1].replace(fchar, rchar[::-1], 1)[::-1]

Out[2]: 'A long string with a . in the middle ending with . -'

Aditya Sihag의 대답은 다음과 rfind같습니다.

pos = a.rfind('.')
a[:pos] + '. -' + a[pos+1:]

이것은 교체 문자열도 반대로합니다. 그 외에는 루트의 대답이 반복되고 내가 거기에서 말했듯이 꽤 비효율적입니다.
Gareth Latty 2013 년

@Lattyware 당신은 그것이 반전을 의미 a합니까?
Alex L

나는 그것이 '. -'출력에서 반전된다는 것을 의미합니다 .
Gareth Latty 2013 년

사용자가 문자열 리터럴을 손으로 뒤집을 것을 기대하는 것은 좋은 생각이 아닙니다. 실수하기 쉽고 명확하지 않습니다.
Gareth Latty 2013 년

@Lattyware 동의합니다. 나는 그것을 var로 만들었습니다. (나는 그것이 비효율적 인 방법, 그리고 모든 경우에 적합하지 않습니다 실현 - 당신의 replace_right훨씬 좋네요입니다)
알렉스 L
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.