我有一个从互联网上删除的文本(我认为这是一个用“latin-1”编码的西班牙文本,并在刮取时解码为unicode)。文字是这样的:
730\u20ac.\r\n\nropa nueva 2012 ... 5,10 muy buen estado..... 170 \u20ac\r\n\nPack 850\u20ac,
之后我对文本进行了一些替换以规范化一些单词(即使用正则表达式替换€符号(\ u20ac)为“欧元”(r'\ u20ac',r'euros'))。
这里我的问题似乎开始......如果我在应用正则表达式之前不将每个字符串编码为“UTF-8”,则正则表达式不会发现任何事件(尽管确实存在很多事件)...
无论如何,在将其编码为UTF-8后,正则表达式(r'\ u20ac',r'euros')可以正常工作。
之后我将所有字符串标记并标记。当我尝试使用regexparser时,我得到了
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 1: ordinal not in range(128)
我的问题是,如果我已将其编码为UTF-8,我现在怎么办?你试图避免它的建议是什么?
有没有办法一劳永逸地进行编码过程,如下所示?如果是这样我该怎么办第二部分(无论如何编码/解码)?
Get text -> encode/ decode it anyway... -> Work on the text without any issue
提前感谢您的帮助!!我是编程的新手,它正在杀了我......
代码明细:
正则表达式功能
replacement_patterns = [(ur' \\u20ac', ur' euros'),(ur' \xe2\x82\xac', r' euros'),(ur' \b[eE]?[uU]?[rR]\b', r' euros'), (ur' \b([0-9]+)[eE][uU]?[rR]?[oO]?[sS]?\b',ur' \1 euros')]
class RegexpReplacer(object):
def __init__(self, patterns=replacement_patterns):
self.patterns = [(re.compile(regex, re.IGNORECASE), repl) for (regex, repl) in patterns]
def replace(self, text):
s = text
for (pattern, repl) in self.patterns:
(s, count) = re.subn(pattern, repl, s)
return s
答案 0 :(得分:1)
您似乎误解了r'\u20ac'
r
表示原始字符串。不是unicode字符串,标准字符串。因此,在模式中使用unicode转义只会得到一个字面反斜杠:
>>> p = re.compile(r'\u20ac')
>>> p.pattern
'\\u20ac'
>>> print p.pattern
\u20ac
如果您想使用原始字符串和 unicode转义符,则必须使用原始unicode 字符串,由ur
表示,而不仅仅是{{ 1}}:
r
答案 1 :(得分:0)
您使用的是解码和放大器吗?编码功能正确吗?
from nltk import ne_chunk,pos_tag
from nltk.tokenize.punkt import PunktSentenceTokenizer
from nltk.tokenize.treebank import TreebankWordTokenizer
text = "€"
text = text.decode('utf-8')
sentences = PunktTokenizer.tokenize(text)
tokens = [TreeBankTokenizer.tokenize(sentence) for sentence in sentences]
tagged = [pos_tag(token) for token in tokens]
如果需要,请尝试使用:
print your_string.encode("utf-8")
我目前没有问题。唯一的问题是50美元,说:
字:$含义:美元字:50意思是:数字,基数
这是对的。 50欧元,说:
字:€50意思是:-NONE -
这是不正确的。
在€符号和数字之间留一个空格,它说:
字:€含义:名词,普通,单数或大众字:50意思是: 数字,红衣主教
哪个更正确。