为什么这个正则表达式返回不可读的字符?

时间:2014-05-08 09:47:40

标签: python regex nlp nltk wordnet

我有一个单词列表。我在WordNet中查找每个单词并选择第一个synset。第一个synset在我的终端上正确显示(例如:Synset('prior.n.01'))。然后,我尝试在转换后的字符串上使用替换正则表达式。预期的输出是'prior.n.01'。但我得到的是那些带有数字的方框。由于我的终端可以在更换之前显示字符串,我猜测问题并非来自于此。那么,这个正则表达式有什么问题吗?是因为我在最初是列表元素的字符串上使用它吗?

这是我正在使用的代码:

import re
import nltk
from nltk.corpus import wordnet as wn

word_list = ['prior','indication','link','linked','administered','foobar']

for word in word_list:
    synset_list = wn.synsets(word)  #returns a list of all synsets for a word

    if synset_list == []:   #break if word in list isn't in dictionary (empty list)
        break

    else:
        first_synset = str(synset_list[0])  #returns Synset('prior.n.01') as string
        print first_synset

        clean_synset = re.sub(r'Synset\((.+)\)',r'\1',first_synset) #expected output: 'prior.n.01'
        print clean_synset

1 个答案:

答案 0 :(得分:1)

实际上有Synset.name()函数来提取同义词集名称:

>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('dog')[0].name()
u'dog.n.01'

还有一个Synset.unicode_repr(),它可以避免任何编码/字节码问题。回到正则表达式:

>>> x = wn.synsets('dog')[0].unicode_repr()
>>> re.sub(r'Synset\((.+)\)','\1',x)
u'\x01'
>>> re.sub(r'Synset\((.+)\)','1',x)
u'1'
>>> re.sub(r'Synset\((.+)\)','\\1',x)
u"'dog.n.01'"
>>> re.sub(r"Synset\(\'(.+)\'\)",'\\1',x)
u'dog.n.01'