У меня есть список китайских словарных статей (на основе CC-CEDICT), который содержит смесь китайских и латинских символов в следующем формате, разделенных символами новой строки:Python регулярное выражение неожиданно заменяя китайские символы
(источника .txt)
traditional_chars simplified_chars, пиньинь, определение
山牆 山墙, shan1 qiang2, двускатной
В 型 超聲 B 型 超声, В xing2 chao1 sheng1, ти ре-Б ультразвук
Я хотел бы поставить запятую между традиционным и упрощенными символами:
(Желаемый результат)
山牆, 山墙, shan1 qiang2, двускатная
B 型 超聲, B 型 超声, B xing2 chao1 sheng1, тип-B Ультразвук
После некоторых экспериментируя в regex101, я пришел с этим рисунком:
[A-z]*[\u4300-\u9fff]+(\s)[A-z]*[\u4300-\u9fff]+,
Я попытался применить эту модель в Python с помощью следующего кода:
import re
sourcepath = 'sourcefile.txt'
destpath = 'result.txt'
pattern = '[A-z]*[\u4300-\u9fff]+(\s)[A-z]*[\u4300-\u9fff]+,'
source = open(sourcepath, 'r').read()
dest = open(destpath, 'w')
result = re.sub(pattern, ',', source)
dest.write(result)
dest.close()
Но когда я открываю Result.txt, результат Я получаю не то, что я ожидал:
, shan1 qiang2, фронтон
, В xing2 chao1 sheng1, тип-B, ультразвуковая
Я также попытался с помощью модуля регулярных выражений с этой схемой:
[A-z]*\p{Han}(\s)[A-z]*\p{Han}
Но результат был тот же.
Я думал, что, поставив символ \ s в круглые скобки, он сделает группу захвата, и только это пространство будет заменено. Но похоже, что и китайские персонажи тоже заменяются. Я допустил ошибку в регулярном выражении, в коде или обоим? Как мне изменить его, чтобы получить желаемый результат?
Попробуйте 're.sub (г '(I) [AZ] * [\ u4300- \ u9fff] + (= \ s + [AZ] * [\ u4300 - \ u9fff] +) ', r' \ g <0>, ', source) '. Или 're.sub (r '[AZ] * (? = ([\ U4300- \ u9fff] +)) \ 1 (?!,)', R '\ g <0>,', source)' –
Второй также нужен аргумент 'flags = re.I'. Кто-нибудь из них работает? –
, какую версию python вы используете? –