문자열에서 문자의 인스턴스 바꾸기


120

세미콜론 (i 지정 위치에서)을 콜론으로 바꾸려고하는이 간단한 코드는 작동하지 않습니다.

for i in range(0,len(line)):
     if (line[i]==";" and i in rightindexarray):
         line[i]=":"

그것은 오류를 준다

line[i]=":"
TypeError: 'str' object does not support item assignment

세미콜론을 콜론으로 바꾸려면 어떻게해야합니까? 이 함수는 인덱스를 사용하지 않기 때문에 replace를 사용하면 작동하지 않습니다. 대체하고 싶지 않은 세미콜론이있을 수 있습니다.

문자열에는 "Hei der!; Hello there;!;"와 같이 여러 세미콜론이있을 수 있습니다.

어떤 것을 바꾸고 싶은지 알고 있습니다 (문자열에 색인이 있습니다). 인덱스를 사용할 수 없으므로 replace를 사용하면 작동하지 않습니다.


1
당신은 알고 계십니까 str.replace()BIF을?
LarsVegas

2
예, 질문에서 설명했듯이. 나는 또한 그것이 나를 위해 작동하지 않는 이유를 설명했습니다.
The Unfun Cat

str.find() 대신 사용 하여 세미콜론의 위치를 ​​찾은 다음 슬라이싱을 사용하여 하위 문자열을 추출합니다.
LarsVegas

1
그렇다면 유효한 대체를 구성하는 것에 대해 더 구체적으로 설명해야합니다. 작동하지 않는 코드는 변경 가능한 경우 문자열의 모든 세미콜론을 대체합니다.
Martijn Pieters

1
@TheUnfunCat : 처음에 인덱스를 어떻게 얻습니까? 모든 일에 더 나은 솔루션 (예를 들어 정규 표현식에)있을 수 있습니다
nneonneo

답변:


207

파이썬의 문자열은 불변이므로 목록으로 취급하고 인덱스에 할당 할 수 없습니다.

사용 .replace()하는 대신 :

line = line.replace(';', ':')

특정 세미콜론 만 교체해야하는 경우 더 구체적이어야합니다. 슬라이싱을 사용하여 대체 할 문자열 섹션을 분리 할 수 ​​있습니다.

line = line[:10].replace(';', ':') + line[10:]

그러면 문자열의 처음 10 자에있는 모든 세미콜론이 바뀝니다.


유니 코드 문자로 작동합니까? 나를 위해 작동하지 않는 것 같습니다.
Steven2163712

@ Steven2163712 : 모든 텍스트는 유니 코드이므로 모든 문자에서 잘 작동합니다. 구체적인 예가 없으면 특정 문제를 해결하는 데 도움을 드릴 수 없습니다.
Martijn Pieters

62

사용하지 않으려면 아래를 수행하여 주어진 색인에서 문자를 각각의 문자로 대체 할 수 있습니다. .replace()

word = 'python'
index = 4
char = 'i'

word = word[:index] + char + word[index + 1:]
print word

o/p: pythin

7
이것은 받아 들여진 대답이어야하며 질문에 직접 대답해야합니다. 이것은 내가 지금까지 찾은 가장 쉬운 방법입니다.
Flare Cat

24

문자열을 목록으로 바꾸십시오. 그런 다음 문자를 개별적으로 변경할 수 있습니다. 그런 다음 다음과 함께 다시 넣을 수 있습니다 .join.

s = 'a;b;c;d'
slist = list(s)
for i, c in enumerate(slist):
    if slist[i] == ';' and 0 <= i <= 3: # only replaces semicolons in the first part of the text
        slist[i] = ':'
s = ''.join(slist)
print s # prints a:b:c;d

6

단일 세미콜론을 바꾸려면 다음을 수행하십시오.

for i in range(0,len(line)):
 if (line[i]==";"):
     line = line[:i] + ":" + line[i+1:]

Havent는 그것을 테스트했습니다.


3
이것은 작동하지만 (+1), ';'를 만날 때마다 새 문자열을 생성하므로 매우 비효율적입니다.
inspectorG4dget

@ inspectorG4dget, 당신 말이 맞아요, 빠르고 더러운-한 번만-해결책입니다.

실제로 @ inspectorG4dget, 받아 들여지는 답변이 동일한 문제로 고통받지 않습니까?

2
line.replace(src,dst)하지 않습니다. line[:10].replace(src,dst) + line[10:]하지만 훨씬 덜 심각합니다. 가정 line = ';'*12. 솔루션은 새 문자열을 12 번 빌드합니다. 허용되는 솔루션은 한 번만 수행합니다.
inspectorG4dget

3

약간 더 일반적인 경우를 다루어야하지만 목적에 맞게 사용자 정의 할 수 있어야합니다.

def selectiveReplace(myStr):
    answer = []
    for index,char in enumerate(myStr):
        if char == ';':
            if index%2 == 1: # replace ';' in even indices with ":"
                answer.append(":")
            else:
                answer.append("!") # replace ';' in odd indices with "!"
        else:
            answer.append(char)
    return ''.join(answer)

도움이 되었기를 바랍니다


3

단순히 문자열의 문자에 값을 할당 할 수는 없습니다. 이 방법을 사용하여 특정 문자의 값을 바꿉니다.

name = "India"
result=name .replace("d",'*')

출력 : In * ia

또한 첫 번째 문자를 제외한 첫 번째 문자의 모든 발생에 대해 *를 대체하려면 예를 들어. 문자열 = babble 출력 = ba ** le

암호:

name = "babble"
front= name [0:1]
fromSecondCharacter = name [1:]
back=fromSecondCharacter.replace(front,'*')
return front+back

1

변수 'n'에 지정된 인덱스 값으로 바꾸려면 다음을 시도하십시오.

def missing_char(str, n):
 str=str.replace(str[n],":")
 return str

1
이 솔루션의 문제는 위치에있는 문자의 모든 항목을 대체 할 것입니다 n 및 아스 커는 해당 특정 발생 대체하고 싶어
shivram.ss

정확하지 않은 솔루션입니다!
Erhard Dinhobl

1

이건 어때요:

sentence = 'After 1500 years of that thinking surpressed'

sentence = sentence.lower()

def removeLetter(text,char):

    result = ''
    for c in text:
        if c != char:
            result += c
    return text.replace(char,'*')
text = removeLetter(sentence,'a')

1

별도의 목록을 만들지 않고 문자열에서 .replace () 메서드를 효과적으로 사용하려면 예를 들어 문자열이 포함 된 목록 사용자 이름을 공백으로 살펴보면 각 사용자 이름 문자열에서 공백을 밑줄로 바꾸고 싶습니다.

usernames = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

각 사용자 이름의 공백을 바꾸려면 파이썬에서 범위 함수를 사용하는 것이 좋습니다.

for i in range(len(usernames)):
    usernames[i] = usernames[i].lower().replace(" ", "_")

print(usernames)

0

특정 색인에서 문자를 바꾸는 기능은 다음과 같습니다.

def replace_char(s , n , c):
    n-=1
    s = s[0:n] + s[n:n+1].replace(s[n] , c) + s[n+1:]
    return s

여기서 s는 문자열, n은 인덱스, c는 문자입니다.


0

특정 인스턴스에서 문자를 바꾸거나 문자열을 바꾸는 방법을 작성했습니다. 인스턴스는 0에서 시작합니다 (선택 사항 인 inst 인수를 1로 변경하고 test_instance 변수를 1로 변경하면 쉽게 1로 변경할 수 있습니다.

def replace_instance(some_word, str_to_replace, new_str='', inst=0):
    return_word = ''
    char_index, test_instance = 0, 0
    while char_index < len(some_word):
        test_str = some_word[char_index: char_index + len(str_to_replace)]
        if test_str == str_to_replace:
            if test_instance == inst:
                return_word = some_word[:char_index] + new_str + some_word[char_index + len(str_to_replace):]
                break
            else:
                test_instance += 1
        char_index += 1
    return return_word

0

다음과 같이 할 수 있습니다.

string = "this; is a; sample; ; python code;!;" #your desire string
result = ""
for i in range(len(string)):
    s = string[i]
    if (s == ";" and i in [4, 18, 20]): #insert your desire list
        s = ":"
    result = result + s
print(result)

0

names = [ "Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

사용자 이름 = []

for i in names:
    if " " in i:
        i = i.replace(" ", "_")
    print(i)

o, p Joey_Tribbiani Monica_Geller Chandler_Bing Phoebe_Buffay


1
고마워요, 무하마드 저는 초보자입니다 최선을 다하겠습니다.
Kasem007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.