Я конвертирую символы IPA в систему, основанную на ARPABET
например:.
'oːg' > 'oo g'
В этом тестовом примере я могу достичь желаемого результата, выполнив следующее:
>>>re.sub(r'(.)ː', r'\1\1 ', 'oːg')
>>>'oo g'
Я понимаю, что 'r' здесь важно, чтобы обратный слеш '\' не был экранирован, и регулярное выражение могло рассматривать '\ 1' как обратную ссылку.
То, что я хочу, - это возможность проходить через dict (созданный из файла CSV), который содержит много правил регулярных выражений, таких как:
mappings = {'(.)ː': '\1\1 ','foo': 'bar', ..}
где я ищу шаблоны, сохраненные в ключах dict в каждом из моих слов IPA, и делаю re.sub, используя соответствующие значения.
Проще говоря, я хочу это:
>>>pattern = '(.)ː'
>>>replpattern = '\1\1 '
>>>ipa = 'oːg'
>>>arpa = re.sub(pattern, replpattern, ipa)
>>>print(arpa)
>>>'oo g'
Самое сложное - заставить Python обрабатывать все различные шаблоны как необработанные строки.
Следуя предложению из аналогичного потока - приведение необработанных строк python - я попытался "hurr .. \ n..durr" .encode ('unicode-escape'). Decode ().
Это в значительной степени работает, за исключением обратной ссылки '\ 1', о чем свидетельствует запуск следующего кода с использованием 'raw_unicode-escape' вместо 'unicode-escape'
>>>z = '\1\1'
>>>z.encode('raw_unicode-escape').decode())
>>>'\x01\x01'
Похоже, что он работает и для других вещей, таких как '\ s', но я получу следующую ошибку, когда у меня появятся такие символы, как "æ":
>>> x = 'æ'
>>> x.encode('raw_unicode-escape').decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe6 in position 0: unexpected end of data
Как мне заставить Python обрабатывать все это последовательно, чтобы дать мне то, что я хочу?
редактирование:
возможно, я неправильно интерпретирую проблему, поэтому я предоставляю всю свою настройку, чтобы понять, имеет ли она смысл.
мой CSV-файл выглядит так:
от, до
(.) ː, \ 1 \ 1
æ, а
.., ..
>>>with open('mappings.csv','r') as f:
>>> lst = [line.strip('\n').split(',') for line in f]
>>> mapping = {line[0]:line[1] for line in lst[1:]}
>>>def caphia(word):
>>> arpaword = word
>>> tmp = []
>>> for map in mapping.keys():
>>> tmp.append(re.findall(map, arpaword))
>>> tmp = sum(tmp,[])
>>> tmp.sort(key = lambda s: -len(s))
>>> unq = set(tmp)
>>> for pattern in unq:
>>> arpaword = re.sub(pattern, mapping[pattern], arpaword)
>>> print(arpaword)
run function
>>> caphia('oːg')
>>>o ːg