这是我的数据的一个样本:
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/