获取字符串中非唯一单词的边界索引

Ren*_*auf 1 python java string clojure

假设我有以下字符串:

 (def strg "apple orange apple")
Run Code Online (Sandbox Code Playgroud)

我想要字符串中每个非唯一单词的边界索引.因此苹果的第一次出现应该具有边界指数(0,4),而苹果的第二次出现应该具有边界指数(13,17).

我一直在玩的一种方法是首先在字符串中存储每个字符的索引,然后,对于每个索引n,通过在n-1处查找空格来识别字边界(是的,这错过了开头的 - -string words).如果满足此条件,则迭代下一个k个字符,直到另一个空格被击中---紧邻该空格之前的位置处的字符是第二个边界索引.这个(失败的)代码的第一部分是

 (for [ch strg] 
      (let [indx  (int  (.indexOf  strg  (str ch)))] 
           (cond  (= (subs ch indx-1 ) " " ) 
           continue with rest of above-described code logic
Run Code Online (Sandbox Code Playgroud)

任何想法(Clojure,Java或Python都很好)将不胜感激

A. *_*ebb 5

对于Clojure/Java来说,更常见的是使用起始字符的索引和结束字符之后的索引,[0, 5][13, 18]不是.Java的Matcher将以这种方式返回每个匹配的开始和结束.

(def strg "apple orange apple")

(defn re-indices [re s] 
  (let [m (re-matcher re s)] 
    ((fn step [] 
       (when (. m find) 
         (cons [(. m start) (. m end)] (lazy-seq (step))))))))

(re-indices #"\S+" strg)
;=> ([0 5] [6 12] [13 18])
Run Code Online (Sandbox Code Playgroud)

subs会适当地使用它们

(->> (re-indices #"\S+" strg)
     (group-by (partial apply subs strg)))
;=> {"apple" [[0 5] [13 18]], "orange" [[6 12]]}
Run Code Online (Sandbox Code Playgroud)

从这里,您只能过滤掉具有多个索引对的子串键.