当前位置:  开发笔记 > 编程语言 > 正文

根据一组单词拆分字符串

如何解决《根据一组单词拆分字符串》经验,为你挑选了3个好方法。

我有一个像这样的字符串列表,

['happy_feet', 'happy_hats_for_cats', 'sad_fox_or_mad_banana','sad_pandas_and_happy_cats_for_people'] 

给定一个关键字列表,['for', 'or', 'and']我希望能够将列表解析为另一个列表,如果关键字列表出现在字符串中,则将该字符串拆分为多个部分.

例如,上面的集合将被拆分为

['happy_feet', 'happy_hats',  'cats', 'sad_fox', 'mad_banana', 'sad_pandas', 'happy_cats', 'people']

目前我已经通过下划线拆分每个内部字符串,并且有一个for循环查找关键字的索引,然后通过下划线重新组合字符串.有更快的方法吗?



1> Tim Pietzcke..:
>>> [re.split(r"_(?:f?or|and)_", s) for s in l]
[['happy_feet'],
 ['happy_hats', 'cats'],
 ['sad_fox', 'mad_banana'],
 ['sad_pandas', 'happy_cats', 'people']]

要将它们组合到一个列表中,您可以使用

result = []
for s in l:
    result.extend(re.split(r"_(?:f?or|and)_", s))



2> Joran Beasle..:
>>> pat = re.compile("_(?:%s)_"%"|".join(sorted(split_list,key=len)))
>>> list(itertools.chain(pat.split(line) for line in data))

将为您提供的示例数据集提供所需的输出

实际上,使用_分隔符,你真的不需要按长度排序,所以你可以这么做

>>> pat = re.compile("_(?:%s)_"%"|".join(split_list))
>>> list(itertools.chain(pat.split(line) for line in data))



3> Martijn Piet..:

您可以使用正则表达式:

from itertools import chain
import re

pattern = re.compile(r'_(?:{})_'.format('|'.join([re.escape(w) for w in keywords])))

result = list(chain.from_iterable(pattern.split(w) for w in input_list))

该模式是从您的关键字列表中动态创建的.该字符串'happy_hats_for_cats'分为'_for_':

>>> re.split(r'_for_', 'happy_hats_for_cats')
['happy_hats', 'cats']

但是因为我们实际上生成了一组备选方案(使用|元字符),您可以拆分任何关键字:

>>> re.split(r'_(?:for|or|and)_', 'sad_pandas_and_happy_cats_for_people')
['sad_pandas', 'happy_cats', 'people']

每个拆分结果都会为您提供一个字符串列表(如果没有任何内容可以拆分,则只有一个); 使用itertools.chain.from_iterable()让我们将所有这些列表视为一个长迭代.

演示:

>>> from itertools import chain
>>> import re
>>> keywords = ['for', 'or', 'and']
>>> input_list = ['happy_feet', 'happy_hats_for_cats', 'sad_fox_or_mad_banana','sad_pandas_and_happy_cats_for_people']
>>> pattern = re.compile(r'_(?:{})_'.format('|'.join([re.escape(w) for w in keywords])))    
>>> list(chain.from_iterable(pattern.split(w) for w in input_list))
['happy_feet', 'happy_hats', 'cats', 'sad_fox', 'mad_banana', 'sad_pandas', 'happy_cats', 'people']

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有