【发布时间】:2014-06-25 15:17:42
【问题描述】:
我有一个单词列表。我在 WordNet 中查找这些单词中的每一个并选择第一个同义词集。这第一个同义词集在我的终端上正确显示(例如: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
【问题讨论】:
-
print repr(clean_synset)显示的值是什么? -
@MartijnPieters 它显示“'prior.n.01'”......所以我猜正则表达式确实有效?
-
是的,确实如此。我希望它适用于您提供的示例输入,
repr()会显示任何偏离您的示例的内容(以可打印的形式)。 else 出了点问题,打印出奇怪的代码点,而不是这段代码。 -
经过一些实验,我意识到每次尝试在正则表达式中使用反向引用(如 \1)时都会出现此问题。所以它可能与 WordNet 或 NLTK 无关。我找到了解决该问题的方法:使用 \g 而不是 \1 可以正常工作。仍然不确定我为什么会遇到这个问题。
-
'\1'和r'\1'有区别;后者不会尝试解释转义序列(这基本上与'\x01'的含义相同。将反斜杠加倍或使用原始字符串文字。
标签: python regex nlp nltk wordnet