【问题标题】:How to split strings based on a list of glossaries?如何根据词汇表列表拆分字符串?
【发布时间】:2019-01-14 07:07:58
【问题描述】:

给定一个词汇表列表:

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

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

【问题讨论】:

  • 您应该为拆分方法动态创建一个正则表达式,例如(UDS|34)。词汇表项目位于交替的一侧。
  • 像这样:re.split('({})'.format('|'.join(glossaries)), word) ?
  • 是的,在这里查看ideone.com/JW7OQR
  • 谢谢@revo!这比我在问题中的原始功能要清楚得多。

标签: regex split nlp tokenize


【解决方案1】:

要按列表中的项目拆分字符串,请即时创建一个正则表达式,包括由管道| 分隔的所有项目,所有项目都包含在捕获组中(非捕获组不包括项目本身在输出):

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

live demo here

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 2020-07-18
    • 2018-06-07
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    相关资源
    最近更新 更多