为什么正则表达式会削减我的话?

时间:2017-05-13 14:38:40

标签: python nltk

我以前的努力与Python NLTK

类似
from nltk.tokenize import RegexpTokenizer

a = "miris ribe na balkanu"

capt1 = RegexpTokenizer('[a-b-c]\w+')

capt1.tokenize(a)

['be', 'balkanu']

这不是我想要的,肋骨被切成了b。这是由Tanzeel建议但没有帮助

>>> capt1
RegexpTokenizer(pattern='\x08[abc]\\w+', gaps=False, discard_empty=True, flags=56)
>>> a
'miris ribe na balkanu'
>>> capt1.tokenize(a)
[]
>>> capt1 = RegexpTokenizer('\b[a-b-c]\w+')
>>> capt1.tokenize(a)
[]

如何改变这一点,只留下最后一句话?

3 个答案:

答案 0 :(得分:2)

您可能需要的是正则表达式中的单词边界/users/?location=london以匹配单词的开头。

将正则表达式更新为\b应该有效。

<强>更新 由于OP无法使用字边界来使用带有NLTK的正则表达式(字边界\b[abc]\w+是一个有效的正则表达式元字符),我自己下载并使用NLTK测试了正则表达式。

此更新的正则表达式现在可以\b使用,它会返回您期望的结果(?<=\s)[abc]\w+

之前没有使用NLTK所以我无法解释为什么字边界不起作用。

答案 1 :(得分:1)

RegexTokenizer的目的不是从输入中提取所选单词,而是根据您的规则将其分解为标记。要查找以abc开头的所有字词,请使用此字段:

import re
bwords = re.findall(r"\b[abc]\w*", 'miris ribe na balkanu')

我不太确定你的目标是什么,所以如果你的目标实际上是提取字符串中的最后一个单词,请使用:

word = re.findall(r"\b\w+$", 'miris ribe na balkanu')[0]

这匹配单词边界和字符串结尾之间的字母串。

答案 2 :(得分:0)

我认为你正在混淆匹配和标记化的概念。

这一行

capt1 = RegexpTokenizer('[abc]\w+')

(不要[a-b-c])说标记器应该查找abc并计算所有内容,直到结束这个词,作为一种象征。

我认为您要做的是标记您的数据,然后丢弃不以abc开头的任何令牌。

这是一个单独的步骤。

>>> capt1 = RegexpTokenizer('\w+')
>>> tokens = capt1.tokenize(a)
# --> ['miris', 'ribe', 'na', 'balkanu']
>>> selection = [t for t in tokens if t.startswith(('a','b','c'))]
# --> ['balkanu']

我在这里使用str.startswith()因为它很简单,但你也可以使用正则表达式。但与tokenizer使用的不同。