Заменить несколько одинаковых строк в слове списком строк из JSON - PullRequest
3 голосов
/ 13 марта 2019

У меня проблемы со сценарием для замены обычных букв на специальные символы для проверки системы перевода, вот пример (cha-mate chá-mate, но будет протестирован с chã-mate / chã-máte и другими варианты), но вместо того, чтобы создавать эти варианты, он переключает все те же символы только на одну специальную букву, вот что она печатает:

chá-máte
chã-mãte

Вот что теоретически следует напечатать:

cha-máte
cha-mãte
chá-mate
chã-mate
etc.

Вот код и используемый json:

def translation_tester(word):
    esp_chars = {
        'a': 'áã',
    }

    #words = [word]
    for esp_char in esp_chars:
        if esp_char in word:
            replacement_chars = esp_chars[esp_char]
            for i in range(len(replacement_chars)):
                print(word.replace(esp_char, replacement_chars[i]))

def main():
    words = ['cha-mate']
    for word in words:
        translation_tester(word)

main()

В любом случае, любая помощь приветствуется, спасибо заранее!

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Возможно, есть более хороший способ сделать это, но вы можете сделать следующее (обязательно включив в список заменяющих символов простое «а»):

import itertools
import re

def replace_at_indices(word, new_chars, indices):
  new_word = word
  for i, index in enumerate(indices):
    new_word = new_word[:index] + new_chars[i] + new_word[index+1:]
  return new_word

def translation_tester(word):
    esp_chars = {
        'a': 'aáã',
    }

    for esp_char in esp_chars:
      replacement_chars = list(esp_chars[esp_char])
      indices = [m.start() for m in re.finditer(esp_char, word)]
      product = list(itertools.product(replacement_chars, repeat=len(indices)))
      for p in product:
        new_word = replace_at_indices(word, p, indices)
        print(new_word)

def main():
    words = ['cha-mate']
    for word in words:
        translation_tester(word)

main()

Для вашего примера:это должно дать вам:

cha-mate
cha-máte
cha-mãte
chá-mate
chá-máte
chá-mãte
chã-mate
chã-máte
chã-mãte

См. также:

Найти все вхождения подстроки в Python

, генерирующих перестановки с повторениямив питоне

Замена символа из определенного индекса

1 голос
/ 13 марта 2019

Чтобы обработать произвольное количество замен, вам нужно использовать рекурсию.Вот как я это сделал.

intword = 'cha-mate'
esp_chars = {'a': 'áã'}

def wpermute(word, i=0):
    for idx, c in enumerate(word[i:], i):
        if c in esp_chars:
            for s in esp_chars[c]:
                newword = word[0:idx] + s + word[idx + 1:]
                wpermute(newword, idx + 1)
        if idx == len(word) -1:
            print(word)

wpermute(intword)

, что дает 9 различных способов написания слова.

chá-máte
chá-mãte
chá-mate
chã-máte
chã-mãte
chã-mate
cha-máte
cha-mãte
cha-mate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...