Форум сайта python.su
0
Всем привет!
Нужна помощь, бьюсь третий день.
Есть бооольшой текст, где приставки типа без, раз, низ и т.д. написаны неверно (безстрашный, безпрестанно)
Как грамотно сделать замену на верные приставки?
Были варианты со словарем, но получается совершенно не то(
Буду рад идеям!
Офлайн
221
ну первое что напрашивается это замена за счет регулярных выражений.
Офлайн
3
В качестве альтернативы регуляркам можешь воспользоваться функцией replace()
text.replace(" безп", " бесп")
gluhie = ["с", "п", "к", "т"] #ну и все глухие согласные for g in gluhie: text.replace(" без"+g, " бес"+g)
prefixes = {'без': 'бес', 'раз': 'рас'} #и так все пары на замену consonants = {'з': 'с', 'б': 'п', 'г': 'к', 'д': 'т'} #и остальные пары глухих и звонких согласных for p in prefixes.keys(): for c in consonants.keys(): #обыгрываются оба случая, как text.replace(' '+p+consonants[c], ' '+prefixes[p]+consonants[c]) # замена "без" в "безспорный" так и text.replace(' '+prefixes[p]+c, ' '+p+с) # замена "бес" в "бесзаконие"
Удачи
Отредактировано MindHatter (Май 11, 2014 17:57:16)
Офлайн
857
MindHatterпоявление лишних пробелов свидетельствует об ошибке при выборе алгоритмаtext.replace(" безп", " бесп")
MindHatterво-во, код стал наполняться всяким мусором из-за пробелов, которые к делу не относятсяtext.replace(' '+p+consonants
MindHatterразвивая дальше, можно сказать, что для строк, в которых замена должна происходить и в первом слове, алгоритм не применим из-за введённых пробелов
Развивая дальше
Отредактировано py.user.next (Май 11, 2014 18:18:25)
Офлайн
3
“в которых замена должна происходить и в первом слове”
о чем я и упомянул в конце поста. Не нужно мне повторять мною же сказанное. Возможно пробелы то и вовсе не нужны. Но что если подобные сочетания могут встретиться в середине слова?
В любом случае я не старался описать готовое решение. К тому же я описал лишь одно правило, или вы хотите весь русский язык в один алгоритм запихнуть?
Офлайн
857
MindHatter.replace() их заменит
Но что если подобные сочетания могут встретиться в середине слова?
>>> import re >>> >>> s = 'wordword1 wordword2 wordword3' >>> >>> re.sub(r'\bw', r'W', s) 'Wordword1 Wordword2 Wordword3' >>>
Офлайн
0
всё проще же, нет?
dSOGL = {u'без': u'бес', u'из': u'ис', u'раз': u'рас',u'роз': u'рос', u'низ': u'нис',u'через': u'черес',} for line in fIn: for k, v in dSOGL.items(): line = re.sub('\\b' + k + u'([кпстфхцчшщ])' + '(\\w+)', v + '\\1' + \ '\\2', line, flags = re.U)
Офлайн
3
Australicys
всё проще же, нет?
Офлайн
857
Australicysи что мешает их просто заменить?
Есть бооольшой текст, где приставки типа без, раз, низ и т.д. написаны неверно (безстрашный, безпрестанно)
Australicysну, там что-то лишнее в re.sub() записано
всё проще же, нет?
Отредактировано py.user.next (Май 12, 2014 05:57:47)
Офлайн
0
MindHatterобратная ситуация мне не нужна
py.user.nextмешает то, что в некоторых случаях они записаны верно, а в некоторых нет
Офлайн