【问题标题】:regex to remove words from a list that are not A-Z a-z (exceptions)正则表达式从列表中删除不是 A-Z a-z 的单词(例外)
【发布时间】:2016-03-04 12:51:10
【问题描述】:

我想从字符串中删除非字母字符并将每个单词转换为列表组件,这样:

"All, the above." -> ["all", "the", "above"]

以下功能似乎有效:

re.split('\W+', str)

但它不考虑极端情况。

例如:

"The U.S. is where it's nice." -> ["the", "U", "S", "is", "where", "it", "s", "nice"]

我希望删除句点,但不删除撇号或“美国”中的句点

我的想法是创建一个正则表达式,其中空格被分解,然后删除额外的标点符号:

"I, live at home." -> ["I", "live", "at", "home"] (comma and period removed)
"I J.C. live at home." -> ["I", "J.C.", "live", "at", "home"] (acronym periods not removed but end of sentence period removed)

对于像这样的句子,我正在尝试做的事情变得足够困难:

"The flying saucer (which was green)." -> ["...", "green"] (ignore ").") 
"I J.C., live at home." -> ["I", "J.C.", "..."] (ignore punctuation)

特殊情况(从原始文本文件中检索字符串):

"I love you.<br /> Come home soon!" -> ["..."] (ignore breakpoint and punctuation) 

我对 python 比较陌生,创建正则表达式让我感到困惑,所以任何关于如何以这种方式解析字符串的帮助都会非常有帮助!如果这里有 22 个问题,并且并非我想要完成的所有事情都是可能的,请告诉我。

【问题讨论】:

  • The person lives in the U.S. 怎么样。是否应该删除最后一个句号,因为它是句子的结尾?或者不是,因为它是首字母缩略词的一部分。
  • ["The", "person", "lives", "in", "the", "U.S."] 就足够了。这是另一个极端案例!谢谢指出
  • 这个级别的自然语言处理比正则表达式所能处理的要复杂得多。
  • 输入总是一个句子还是你要抛出多个句子?
  • @Max 也许你应该使用你的包装器,然后使用正则表达式来帮助删除 after 你已经用你的包装器解析了它。

标签: python regex string list


【解决方案1】:

虽然我知道您是在专门询问正则表达式,但您的整体问题的另一种解决方案是为此明确目的使用库。例如nltk。它应该可以帮助您以合理的方式拆分字符串(将正确的标点符号解析为列表中的单独项目),然后您可以从那里过滤掉。

你是对的,极端情况的数量是巨大的,正是因为人类语言是不精确和模糊的。使用已经解决了这些边缘情况的库应该可以省去很多麻烦。

在 nltk 中处理原始文本的有用入门指南是 here。似乎对您的用例最有用的函数是 nltk.word_tokenize,它传回一个字符串列表,其中单词和标点符号分开。

【讨论】:

  • 我使用的包装器实际上是 nltk,我现在意识到,一旦我在包装器中处理了无关单词,我将不得不简单地删除它们。
【解决方案2】:

这是一个 Python 正则表达式,可以用来拆分您提供的句子。

((?<![A-Z])\.)*[\W](?<!\.)|[\W]$

Try it here

由于所有带句点的缩写都应该在句点之前有一个大写字母,我们可以使用否定的lookbehind来排除这些句点:

((?<![A-Z])\.)*

然后拆分所有其他非句点非字母数字:

[\W](?<!\.)

或行尾的符号:

|[\W]$

我在这些字符串上测试了正则表达式:

The R.N. lives in the U.S.

The R.N., lives in the U.S. here.

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 2011-04-01
    • 2011-08-26
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多