【问题标题】:Why does this regex return unreadable characters?为什么这个正则表达式返回不可读的字符?
【发布时间】: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


【解决方案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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多