【问题标题】:python choose one object from arraypython从数组中选择一个对象
【发布时间】:2013-03-29 21:35:37
【问题描述】:

我有一个脚本返回 gtk textview 对象中字符串的开始/结束位置。 我觉得我一遍又一遍地做同样的事情。 第一个搜索函数返回每个匹配位置的开始、结束。第二个我希望搜索并突出显示数组给出的文本视图中的每个对象。 searchn() 我注意到我可以更改数组选择并选择第二个到最后一个或我选择的任何内容。

有没有一种方法可以每次点击数组中的每个对象一次选择一个,这样它就会按顺序突出显示数组中的一个对象。

所以如果我有四个字

工作 工作 工作 工作

然后我可以突出显示第一个然后我再次单击它会重新运行该功能并突出显示第二个然后第三个,当它全部完成后我可以让它回到开头。我在想什么喜欢。 对于 len(z) 中的范围: 做这个 但无论我在 for 循环中做什么,它都会选择最后一个步骤。我希望这是有道理的。

def search(x):
search_required = False
sbuffer.remove_tag_by_name('found', sbuffer.get_start_iter(), sbuffer.get_end_iter())
    find_text = findentry.get_text()
    if find_text:
  text = sbuffer.get_text(sbuffer.get_start_iter(),sbuffer.get_end_iter()).decode('utf8')
      search_matches = [(match.start(), match.end()) for match in re.finditer(re.escape(find_text), text, re.IGNORECASE)]
      if len(search_matches) < 1000:
    for start,end in search_matches:
      iter1 = sbuffer.get_iter_at_offset(start)
      iter2 = sbuffer.get_iter_at_offset(end)
      sbuffer.select_range(iter1, iter2)
      sbuffer.apply_tag_by_name('found', iter1, iter2)
    textview.scroll_to_mark(sbuffer.get_mark('insert'), 0.25)
    print search_matches
    return search_matches
else:
  search_matches = [ ]    



  def searchn(x):
search(x)
z=search(x)
#def SN(z)
print len(z)
z=z[:1]# need to have this do to 2nd,3rd,4th,5th ect till there are no more matches.
for a,l in z:
  print a,"start of this match"
  print l, "end of this match"
  iter1 = sbuffer.get_iter_at_offset(a)
  iter2 = sbuffer.get_iter_at_offset(l)
  sbuffer.select_range(iter1,iter2)
  print z
return z  

提前谢谢你!

【问题讨论】:

    标签: python arrays find highlighting


    【解决方案1】:

    您为什么不使用正则表达式来查找您要查找的单词的实例,然后在获得所有索引后进行循环。

    例子:

    import re
    sentence = "You are my favorite. Are you my friend? Are you an elephant?"
    items = []
    for item in re.finditer("[Aa]re", sentence, ):
        items.append(item.start())
    

    这应该为您提供单词所在的位置。一旦你有了这些,你应该能够以任何你喜欢的方式快速轻松地穿过这些位置。

    【讨论】:

    • 我有所有单词的位置,是的,我也在使用 re。也许我错过了一些东西,但是有没有办法做一些事情 items[:1] 那么下次我运行该函数时它将是 items[:2] 以便我可以遍历数组并突出显示它们?顺便说一句,谢谢你的快速回复队友!:)
    • 如何将列表创建放入一个函数中,当您要查找所有单词时将使用该函数。然后,当您突出显示单词时,每次迭代时只需删除列表中的第一项?
    • 听起来是个好主意,我在考虑这个选择工作[:1] list.remove work[:1]。我看看它是否有效。如果您知道这样做的好方法,请告诉我;)。谢谢 立即尝试。

    • 这是我所拥有的
      def searchn(x): #search(x) z=search(x) #print len(z) print z , "First" z=z[:1] # 需要对 2,3,4,5 等执行此操作,直到没有更多匹配项为止。 if findentry.get_text() != " ": for a,l in z[:1]: #print a,l iter1 = sbuffer.get_iter_at_offset(a) iter2 = sbuffer.get_iter_at_offset(l) sbuffer.select_range(iter1,iter2 ) 删除 z [:1]
    【解决方案2】:

    你知道这个想法确实在几天前的梦中出现在我的脑海中。我一直在搞砸它......:P 这是工作。谢谢爵士白! Python 向前和向后搜索功能。我希望它可以帮助任何想要制作这样的东西的人。对于其他人来说 Base 是我的主要课程,sbuffer 是 textview.get_buffer() 是的,我正在使用 gtk。

      searchmatchp=None
      searchmatchf=None
      def search(x):
    sbuffer.remove_tag_by_name('found', sbuffer.get_start_iter(), sbuffer.get_end_iter())
        find_text = findentry.get_text()
        if find_text:
      text = sbuffer.get_text(sbuffer.get_start_iter(),sbuffer.get_end_iter()).decode('utf8')
          search_matches = [(match.start(), match.end()) for match in re.finditer(re.escape(find_text), text, re.IGNORECASE)]
          if len(search_matches) < 1000:
        for start,end in search_matches:
          iter1 = sbuffer.get_iter_at_offset(start)
          iter2 = sbuffer.get_iter_at_offset(end)
          sbuffer.select_range(iter1, iter2)
          sbuffer.apply_tag_by_name('found', iter1, iter2)
        textview.scroll_to_mark(sbuffer.get_mark('insert'), 0.25)
        Base.searchmatchp=search_matches
        Base.searchmatchf=search_matches
        #return search_matches
    else:
      search_matches = [ ]    
    
    
    
      def searchn(self):
    print Base.searchmatchf
    for a,l in Base.searchmatchf[:1]:
      iter1 = sbuffer.get_iter_at_offset(a)
      iter2 = sbuffer.get_iter_at_offset(l)
      sbuffer.select_range(iter1,iter2)
      textview.scroll_to_mark(sbuffer.get_mark('insert'), 0.25)
    del Base.searchmatchf[:1]  
    if Base.searchmatchf ==[]:
      search(self)
    
    
    
    
      def searchp(self):
    print Base.searchmatchp
    del Base.searchmatchp[-1:] 
    print Base.searchmatchp[-1:]
    for a,l in Base.searchmatchp[-2:]:
      iter1 = sbuffer.get_iter_at_offset(a)
      iter2 = sbuffer.get_iter_at_offset(l)
      sbuffer.select_range(iter1,iter2)
      textview.scroll_to_mark(sbuffer.get_mark('insert'), 0.25)
    if Base.searchmatchp ==[]:
      search(self)
    

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      相关资源
      最近更新 更多