【问题标题】:Python Regex Matching - Splitting on punctuation but ignoring certain wordsPython 正则表达式匹配 - 拆分标点符号但忽略某些单词
【发布时间】:2019-01-16 21:16:29
【问题描述】:

假设我有以下句子,

大家好,我的名字是 Dr. Who。我爱上了鱼指和蛋奶冻!!

我正在尝试使用正则表达式捕获标点符号(撇号和连字符除外),但我也想忽略某些单词。例如,我忽略了 Dr.,所以我不想捕获 .在博士这个词中。

理想情况下,正则表达式应该捕获括号之间的文本:

嗨(,)我的()名字()是()博士()谁(。)我()在()爱()和()鱼手指()和()奶油冻(!! )

请注意,我有一个 Python 列表,其中包含“博士”之类的词。我想忽略的。我还使用 string.punctuation 来获取要在正则表达式中使用的标点符号列表。我尝试过使用负前瞻,但它仍在捕捉“。”在博士。任何帮助表示赞赏!

【问题讨论】:

  • 单词的位置是否相关?还是只是您要忽略的列表中的单词。首先删除要忽略的单词可能更容易。能举个完整的例子吗?
  • 用正则表达式很难做到这一点。您想要一个匹配标点符号的正则表达式,但有一个否定的后视来忽略某些单词。但是负面的lookbehinds必须是固定的长度,你要忽略的词可能不都是相同的长度。
  • 你有什么理由不使用 NLP 库?
  • 我确实尝试过 ntlk 和 spacey,但这并不完全是我想要的。
  • 你的意思是,“在括号之间?”比如,你想捕获['Hi', 'my' ...]吗?

标签: python regex


【解决方案1】:

您可以先扔掉所有停用词(如“Dr.”),然后扔掉所有字母(和数字)。

import re

text = "Hi, my name is Dr. Who. I'm in love with fish-fingers and custard !!"
tmp = re.sub(r'[Dr.|Prof.]', '', text)
print(re.sub('[a-zA-Z0-9]*', '', tmp))

这行得通吗?

它会打印出来:

,      '    -   !!

输出捕获括号之间的文本,在您的问题中。

【讨论】:

  • 我不想丢掉任何单词,因为这个正则表达式的主要用途是使用 re.split,这样我就可以根据捕获的字符对字符串进行标记。
  • 这应该作为评论发布,而不是答案。
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2014-03-24
  • 2018-01-02
  • 1970-01-01
  • 2021-09-22
相关资源
最近更新 更多