我有一个句子“中国北京上海美国澳大利亚”和一组单词#{“美国”“澳大利亚”}
现在我正在写一个函数,它把输入作为句子和词集,并从句子中删除:
(defn remove-words-from-sentence [sentence words]
(for [w words] (-> sentence
(.replaceAll w "")))
注:我想替换确切的单词发生。因此,如果单词中包含字母"a",那么所有a's都不应该在句子中被替换,只应该替换单词a。
但是上面的功能不起作用,有帮助吗??
发布于 2014-11-16 03:46:48
你可以这样做的一种方法是把句子分成几个单独的单词,然后把单词放在一个集合中删除,然后过滤掉句子中的单词。
(let [sentence (clojure.string/split (read-line) #" ")
words (set (clojure.string/split (read-line) #" "))]
(clojure.string/join " "
(filter (complement words)
sentence)))
user=> china beijing shanghai USA australia ;;input sentence
user=> china USA ;;input words
user=> "beijing shanghai australia" ;;output
编辑:
Thumbnail提请我注意,(filter (complement pred) coll)
等同于(remove pred coll)
。可以通过查看remove
的源代码来验证这一点。
(source remove)
(defn remove
"Returns a lazy sequence of the items in coll for which
(pred item) returns false. pred must be free of side-effects."
{:added "1.0"
:static true}
[pred coll]
(filter (complement pred) coll))
nil
所以我们可以用remove
代替
(let [sentence (clojure.string/split (read-line) #" ")
words (set (clojure.string/split (read-line) #" "))]
(clojure.string/join " " (remove words sentence)))
这样就更容易读懂了。你可以把它读成“从句子中删除单词”。
发布于 2014-11-16 03:36:05
for
在给定的seq上迭代,产生另一个序列。因此,您正在生成一个列表,其元素分别表示每个替换,而不是组合在一起。
你想要的是首先替换第一个单词,然后--根据替换的结果--删除第二个单词,以此类推。这是reduce
的典型案例
(defn remove-words-from-sentence
[sentence words]
(reduce #(.replace % %2 "") sentence words))
(请注意,replace
与replaceAll
相同,但使用文字替换,不允许正则表达式。)
编辑:--这只是修复OP试图做的事情。如果其中一个词是"eij“(因为它将删除”北京“的那一部分),它可能会产生不想要的结果。解决这一问题的一种方法是使用(.replaceAll % (str "\\b\\Q" %2 "\\E\\b\\s*") "")
进行替换;然后trim
结果。因此,一个更可靠的版本可能如下所示:
(require '[clojure.string :as string])
(defn remove-words-from-sentence
[sentence words]
(let [pattern (->> (for [w words] (str "\\b\\Q" w "\\E\\b"))
(string/join "|")
(format "(%s)\\s*"))]
(.trim (.replaceAll sentence pattern ""))))
但这完全取决于OP想要什么。
发布于 2014-11-20 16:18:26
user> (defn remove-words-from-sentence
[sentence & words]
(loop [sentence sentence
ws words]
(if-not (seq ws)
sentence
(recur
(clojure.string/replace sentence (first ws) "")
(rest ws)))))
#'user/remove-words-from-sentence
user> (remove-words-from-sentence "Hello, World" "World")
;=> "Hello, "
user> (remove-words-from-sentence "Hello, World" "ll" "o" "H")
;=> "e, Wrld"
https://stackoverflow.com/questions/26956377
复制