这是我的数据的一个样本:

case time (especially it's purse), read manual care, follow care instructions make stays waterproof -- example, inspect rubber seals doors (especially battery/memory card door open time)
xm "life support" picture . flip part bit flimsy guessing won't long . sound great altec speaker dock it! chance back base (xm3020) . traveling bag connect laptop extra speaker . amount paid ($25).

我想删除除dot(.)以外的所有标点符号,还希望删除带有length < = 2的单词,例如,我的预期输出是:
case time especially its purse read manual care follow care instructions . make stays waterproof example inspect rubber seals doors especially batterymemory card door open time
life support picture . flip part bit flimsy guessing wont long . sound great altec speaker dock chance back base xm3020 . traveling bag connect laptop extra speaker . amount paid $25 .

这应该在Scala中实现,
我试过了 :
replaceAll( """\\W\s""", "")
replaceAll(""""[^a-zA-Z\.]""", "")

但是效果不好,有人可以帮我吗?

最佳答案

查看正则表达式javadoc(http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html),我们看到标点符号类是\p{Punct},并且可以使用[a-z&&[^def]]这样的东西从字符类中删除字符。从那时起,很容易定义一个正则表达式,该正则表达式将删除除点之外的所有标点符号:

s.replaceAll("""[\p{Punct}&&[^.]]""", "")

可以删除大小小于等于2的单词,如下所示:
s.replaceAll("""\b\p{IsLetter}{1,2}\b""")

结合两者,可以得出:
s.replaceAll("""([\p{Punct}&&[^.]]|\b\p{IsLetter}{1,2}\b)\s*""", "")

请注意我如何添加\s*来删除多余的空格。

另外,您可以看到上面的正则表达式完全删除了“$”,因为它,是标点符号(由unicode定义)。
如果这不是所希望的(似乎表明您期望的输出),请更精确地考虑标点符号。
例如,您可能只想将以下字符视为标点符号:?.!:():
s.replaceAll("""([?.!:]|\b\p{IsLetter}{1,2}\b)\s*""", "")

另外,您也可以将“$”以及点号添加到“非标点”字符列表中:
s.replaceAll("""([\p{Punct}&&[^.$]]|\b\p{IsLetter}{1,2}\b)\s*""", "")

关于regex - 在Scala中删除标点符号形式的文本-Spark,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30074109/

10-13 07:56