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都很好)将不胜感激
对于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)
从这里,您只能过滤掉具有多个索引对的子串键.
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |