Как заменить букву в строке на любую другую букву, кроме себя или соседних в python - PullRequest
0 голосов
/ 03 марта 2019

Допустим, у меня есть строка 'xyxxxyx'.Я хочу заменить x посередине на любую другую букву, кроме (x и y (соседние буквы), чтобы сделать строку, чтобы каждая соседняя буква была разной.

Как пример

Input: 'xyxxxyx'  
Output: 'xyxzxyx' 

Я хочу, чтобы это было универсально для любой входной строки.

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Это можно сделать с помощью регулярных выражений:

import re

def noDoubles(string):
    subChars = set("wxyz")
    result   = list(string)
    for match in re.finditer(r"(.)(\1+)",string):
        usedChars = set(string[match.start():match.end()+1])
        altChars  = list(subChars - usedChars)
        size      = match.end(2) - match.start(2)
        size      = size - (size>1) 
        result[match.start(2):match.start(2)+size] = (altChars[:2]*size)[:size]
    return "".join(result)

print(noDoubles("xyxxxyaaabbyyaaaaa")) # "xyxzxyazabzyzazwza"

Выражение (.) (\ 1+) находит первый символ и последующие повторения строки повторяющихся символов.Зацикливание совпадений позволит вам заменить эту последующую часть чередующимся набором символов, которые не повторяются и не следуют за ним.Вам нужно использовать чередующийся шаблон для замены, чтобы не создавать новые повторения.

Обратите внимание, что нам нужно работать только с 4 символами замещения, потому что повторяющийся символ и следующий символ будут либо одним, либодва из 4 (оставляя два для альтернанса) или ни одного из них (что позволяет нам использовать любые два из 4).

0 голосов
/ 03 марта 2019

Вот способ решить ваш вопрос с помощью groupby из itertools модуля:

from itertools import groupby

def rep_adj(data, char='z'): 
    for _, v in groupby(data): 
        b = list(v) 
        if len(b) > 0: 
            for i, j in enumerate(b): 
                yield char if not i%2==0 else j

data = 'xyxxxyx' 
out = ''.join(rep_adj(data))
print(out)

Вывод:

'xyxzxyx'
0 голосов
/ 03 марта 2019

Это поможет:

a='xyxxxyx'
import string
from random import randint
total=[x for x in list(string.ascii_lowercase) if x not in spil] # gets alphabets a to z in a list except the ones in a

spil=list(a) #spilt the string a in letters
for i in range(len(spil)-1):
    if spil[i]==spil[i+1]: #if two consecitive are same then changes the next one with a random alphabet

        spil[i]=total[randint(0,len(total))]
print("".join(spil))

Вывод будет:

'xyczxyx'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...