Обрабатывать символы Юникода с помощью регулярных выражений Python - PullRequest
2 голосов
/ 24 февраля 2011

Я пишу простое приложение, в котором я хочу заменить определенные слова другими словами.Я сталкиваюсь с проблемами со словами, которые используют одинарные кавычки, такие как aren't, ain't, isn't.

У меня есть текстовый файл со следующими

aren’t=ain’t
hello=hey

Iразобрать текстовый файл и создать из него словарь

u'aren\u2019t' = u'ain\u2019t'
u'hello' = u'hey'

Затем я пытаюсь заменить все символы в данном тексте

text = u"aren't"

def replace_all(text, dict):
    for i, k in dict.iteritems():
        #replace all whole words of I with K in lower cased text, regex = \bSTRING\b
        text = re.sub(r"\b" + i + r"\b", k , text.lower())
    return text

Проблема в том, что re.sub() не соответствуетu'aren\u2019t' с u"aren't".

Что я могу сделать, чтобы моя replace_all() функция соответствовала "hello" и `" not "и заменяла их соответствующим текстом?Могу ли я сделать что-то на Python, чтобы мой словарь не содержал Unicode?Могу ли я преобразовать свой текст в символ Unicode или изменить регулярное выражение, чтобы оно соответствовало символу Unicode, а также всему остальному тексту?

Ответы [ 4 ]

3 голосов
/ 24 февраля 2011

Я полагаю, ваша проблема:

text = u"aren't"

вместо:

text = u"aren’t"

(обратите внимание на различные апострофы?)

Вот ваш код, измененный, чтобы сделать егоработа:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

d = {
    u'aren’t': u'ain’t',
    u'hello': u'hey'
    }
#text = u"aren't"
text = u"aren’t"


def replace_all(text, d):
    for i, k in d.iteritems():
        #replace all whole words of I with K in lower cased text, regex = \bSTRING\b
        text = re.sub(r"\b" + i + r"\b", k , text.lower())
    return text

if __name__ == '__main__':
    newtext = replace_all(text, d)
    print newtext

Выход:

ain’t
0 голосов
/ 24 февраля 2011
u"aren\u2019t" == u"aren't"

False

u"aren\u2019t" == u"aren’t"

True

0 голосов
/ 24 февраля 2011

попробуйте сохранить ваш файл в кодировке UTF-8

0 голосов
/ 24 февраля 2011

Это прекрасно работает для меня в Python 2.6.4:

>>> re.sub(ur'\baren\u2019t\b', 'rep', u'aren\u2019t')
u'rep'

Убедитесь, что строка шаблона является строкой Unicode, в противном случае она может не работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...