как использовать строковую переменную, содержащую обратную ссылку '\ 1' в качестве шаблона регулярного выражения для преобразования символов ipa в систему, подобную арпабету - PullRequest
0 голосов
/ 18 мая 2019

Я конвертирую символы 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:

Это в значительной степени работает, за исключением обратной ссылки '\ 1', о чем свидетельствует запуск следующего кода с использованием 'raw_unicode-escape' вместо 'unicode-escape'

>>>z = '\1\1'
>>>z.encode('raw_unicode-escape').decode())
>>>'\x01\x01'
  • Issue2:

Похоже, что он работает и для других вещей, таких как '\ 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 

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

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

Проблема была со всей моей настройкой, которую я закончилвверх меняется.

0 голосов
/ 18 мая 2019

я попробовал приведенный ниже код. Посмотрите, \ 1 \ 1 читается из файла "text.txt". Когда я читаю из файла, код работает без проблем. Я думаю, что когда вы делаете это replpattern = '\1\1 ' в интерпретаторе python, шаблон анализируется. Однако во время выполнения, когда шаблон читается из файла, шаблон уже обрабатывается как необработанная строка.

pattern = '(.):'
replpattern = open('text.txt').read() # Reading '\1\1 ' form file

print(re.sub(pattern, replpattern, 'o:g'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...