2014-11-25 2 views
-2

У меня вопрос, похожий на this question. Но у меня есть дополнительный вопрос. Взяв ту же таблицу из этого вопроса ниже, я добавил несколько дополнительных строк.Замена аббревиатур от словаря

A,B,C,D 
RNA,lung cancer,15,biotin 
RNA,lung cancer,15,biotin 
RNA,breast cancer,15,biotin 
RNA,breast cancer,15,biotin 
RNA,lung cancer,15,biotin 
65 y 4m,prostate cancer,biotin 
m,lung cancer,biotin 

Цитируя тот же словарь образца с тремя дополнительными линиями

rna,ribonucleic acid 
rnd,radical neck dissection 
rni,recommended nutrient intake 
rnp,ribonucleoprotein 
m,months 
m,male 
y,years 

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

A,B,C,D 
ribonucleic acid,lung cancer,15,biotin 
ribonucleic acid,lung cancer,15,biotin 
ribonucleic acid,breast cancer,15,biotin 
ribonucleic acid,breast cancer,15,biotin 
ribonucleic acid,lung cancer,15,biotin 
65 years 4months,prostate cancer,biotin 
male,lung cancer,biotin 
+0

Отличить один «м» от месяца «м» (мужчина) довольно сложно. – snotna

+0

@snotna Я уверен, это можно сделать с помощью регулярного выражения, в котором я действительно плохо. – abn

ответ

0

Для каждой замены, что вы хотите сделать, определить шаблон и строку Подставив. Сделайте шаблон захвата текста, который появляется непосредственно перед заменяемым текстом. Вы можете использовать этот текст при выполнении замены. Примерно так:

import re 

month_pair = (re.compile('(\d\s*)m'), 'months') 
year_pair = (re.compile('(\d\s*)y'), 'years') 

def substitute(s, pairs): 
    for (pattern, substitution) in pairs: 
    match = pattern.search(s) 
    if match: 
     s = pattern.sub(match.group(1)+substitution, s) 
    return s 

pairs = [month_pair, year_pair] 
print(substitute('65 y 4m', pairs)) 
Смежные вопросы