1

我正在尝试解析python中的句子-对于我得到的任何句子,我应该只使用出现在“say”或“ask”之后的单词(如果这些单词没有出现,我应该使用整个句子)我只需使用正则表达式即可:

sen = re.search('(?s)(?<=say|Say).*$', current_game_row["sentence"], re.M | re.I)

(这仅适用于“说”,但添加“询问”不是问题......)

问题是,如果我在“说”这个词之后得到一个带有逗号、冒号 (,:) 之类的标点符号的句子,它也会使用它。有人建议我使用 nltk 标记化来定义它,但我是 python 新手,不明白如何使用它。我看到 nltk 具有 RegexpParser 功能,但我不确定如何使用它。请帮我 :-)

** 我忘了提——我也想识别“说”/“问”等,不想抓住包含“说”或“问”的词(我不确定是否有这样的词。 ..)。另外,如果 where are multiply 'say' 或 'ask' ,我只想抓住句子中的第一个标记。**

4

1 回答 1

0

关键字后的所有内容

\w我们可以通过吃掉所有非 unicode来处理不需要的标点符号。

sentence = "Hearsay? With masked flasks I said: abracadabra"

keys = '|'.join(['ask', 'asks', 'asked', 'say', 'says', 'said'])
result = re.search(rf'\b({keys})\b\W+(.*)', sentence, re.S | re.I)

if result == None:
    print(sentence)
else:    
    print(result.group(2))

输出:

abracadabra 

case-sensitive:您有不区分大小写的标志re.I,因此我们可以删除Say排列。

多行:您可以re.M选择^不仅在字符串的开头匹配,而且\n在该字符串中的每一个之后都匹配。我们可以放弃它,因为我们不需要使用^.

dot-matches-all:您有(?s)哪些指示.匹配所有内容,包括\n. 这与应用re.S标志相同。

我不确定同时拥有re.M和的最终效果re.S是什么。我认为您的句子可能是一个带有换行符的文本块,所以我删除re.M并保留(?s)re.S

于 2021-02-05T10:42:57.737 回答