正则表达式从列表中删除不是A-Z a-z的单词(例外)

时间:2015-11-30 19:14:41

标签: python regex string list

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

"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,并不是我想要完成的所有事情都可以让我知道。

2 个答案:

答案 0 :(得分:2)

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

你是对的,角落案件的数量非常精确,因为人类语言是不精确和模糊的。使用已经解决这些边缘情况的库可以为您节省很多麻烦。

有关在nltk中处理原始文本的有用入门知识是here。对于您的用例而言,最有用的功能似乎是.flexbox { width: 100%; display: flex; align-items: flex-start; } img { width: 50%; } ,它会传回一个字符串列表,其中包含单词和标点符号。

答案 1 :(得分:0)

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

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

Try it here

由于所有带句点的缩写都应在句号之前加上大写字母,因此我们可以使用负面的观察来排除这些句号:

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

然后拆分所有其他非期间非字母数字:

[\W](?<!\.)

或一行末尾的符号:

|[\W]$

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

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

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