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

2024-04-16 15:25:08 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下字符串:

 (def strg "apple orange apple")

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

我一直在使用的一种方法是,首先存储字符串中每个字符的索引,然后,对于每个索引n,通过在n-1处寻找一个空格来标识单词边界(是的,这忽略了字符串单词的开头)。如果满足此条件,则遍历下一个k个字符,直到命中另一个空格——该空格前一个位置的字符是第二个边界索引。此(失败)代码的第一部分是

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

任何想法(Clojure、Java或Python都可以)都将不胜感激


Tags: 方法字符串苹果appledefch指数字符
2条回答

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])

而且subs会适当地使用它们

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

从这里您可以过滤出只有那些子串键与一个以上的索引对。你知道吗

In [9]: import re

In [13]: def find_ind(word, s):
             return [(w.start(), w.end() - 1) for w in re.finditer(word, s) if s.count(word) > 1]

In [14]: find_ind("apple",s)
        [(0, 4), (13, 17)]

In [15]: find_ind("orange",s)
        []

使用python和re.finditer

返回一个迭代器,在字符串中的RE模式的所有非重叠匹配上生成MatchObject实例

相关问题 更多 >