代码之家  ›  专栏  ›  技术社区  ›  alvas

如何根据词汇表列表拆分字符串?

  •  1
  • alvas  · 技术社区  · 6 年前

    给出词汇表:

    glossaries = ['USA', '34']
    

    目标是使用词汇表中的项目,并使用词汇表作为分隔符拆分字符串。例如,给定字符串和词汇表, _isolate_glossaries() 功能:

    glossaries = ['USA', '34']
    word = '1934USABUSA'
    _isolate_glossaries(word, glossaries)
    

    应输出:

    ['19', '34', 'USA', 'B', 'USA']
    

    我试过了:

    def isolate_glossary(word, glossary):
        print(word, glossary)
        # Check that word == glossary and glossary not in word
        if re.match('^{}$'.format(glossary), word) or not re.search(glossary, word):
            return [word]
        else:
            segments = re.split(r'({})'.format(glossary), word)
            segments, ending = segments[:-1], segments[-1] # Remove the last catch with null string.
            return segments
    
    def _isolate_glossaries(word, glossaries):
        word_segments = [word]
        for gloss in glossaries:
            word_segments = [out_segment
                             for segment in word_segments 
                             for out_segment in isolate_glossary(segment, gloss)] 
        return word_segments
    

    它可以工作,但它看起来有点过于复杂,以至于无法进行如此多级别的循环和正则表达式拆分。 有没有更好的方法根据词汇表拆分字符串?

    1 回复  |  直到 6 年前
        1
  •  2
  •   revo shanwije    6 年前

    要按列表中的项目拆分字符串,请动态创建一个regex,其中包括由管道分隔的项目。 | 全部包含在捕获组中(非捕获组不在输出中包含项目本身):

    list = re.split('({})'.format('|'.join(glossaries)), word);
    print ([x for x in list if x]) # filter non-word items
    

    live demo here

    推荐文章