从字符串中获取特定字符并将它们附加到列表中

Posted

技术标签:

【中文标题】从字符串中获取特定字符并将它们附加到列表中【英文标题】:Getting specific characters from a string and appending them to a list 【发布时间】:2022-01-21 04:55:14 【问题描述】:

我有一个字符串如下:

my_string = "Jack 无法解释他的愚蠢错误。计算机该国商业用电量的 5%。是时候关注 公司的核心业务。公司需要专注于其最大的客户......”

还有一个清单:

短语动词 = [ “占”, “为”, “采取行动”, “行动起来”, “行动起来”, “添加在”, “专注于” ...]

我想用计数器模块找出每个短语动词在字符串中出现的次数,并从字符串中删除短语动词。到目前为止我的代码是:

phrasal_verbs_list = []
for pv in Phrasal_Verbs:
if pv in my_string:
    phrasal_verbs_list.append(pv)
    my_string = my_string.replace(pv, "")
pv_count = dict(Counter(phrasal_verbs_list))

上面的代码找到了所有的短语动词,但即使字符串中有三个“Account for”,它也只给了我一个。

预期 pv_count = 'account for' : 2, 'focus on' : 2, rest_of_the_phrasal_verbs : 出现次数

Got = 'account for': 1, 'act out': 1, 'allow for': 1, 'be in': 1, 'be on': 1, 'blow down': 1, .. .'专注':1

【问题讨论】:

你的问题到底是什么?您想知道如何修复当前的实现,还是愿意接受更好的实现?此外,为清楚起见,提供minimal reproducible example 会有所帮助,包括准确的输入、准确的预期输出和实际输出。如需更多提示,请参阅How to Ask。 @Manlai 我回滚了您的编辑,因为 OP 在第一个 sn-p 中添加了格式,在将其转换回代码之前应该将其删除,最后两个 sn-ps 不是有效代码,所以我希望OP澄清。此外,Phrasal_Verbs 更易于阅读,分成不同的行。 【参考方案1】:

你可以这样做

pv_count = string: my_string.count(string) for string in Phrasal_Verbs

然后,如果你想从字符串中删除短语动词:

import re
text = re.sub("|".join(pv_count.keys()), "", my_string)

您也可以直接调用Phrasal_Verbs 而不是 cmets 中指出的 `pv_count.keys()。

【讨论】:

pv_count.keys() 根据定义与Phrasal_Verbs 相同,除非您要执行中间步骤来删除 0 个计数。 好点。我想直接调用 Phrasal_Verbs 会更有效,但我会留下它,因为正如你所说,如果想进一步转换 pv_count,可能会走这条路。 如果任何Phrasal_Verbs 重叠,例如"be in", "be into",则该替换可能无法正常工作。 OP 的示例不包含任何类似的内容,但仍然需要注意。我认为您可以使用单词边界来修复它:r'\b(' + '|'.join(pv_count.keys()) + r')\b'【参考方案2】:

发生这种情况是因为 replace 替换了该字符串的所有匹配项,因此,剩余的匹配项不会被计算在内,导致计数为 1。

使用my_string.replace(pv, "", 1) 仅替换第一个匹配项。这应该可以解决您的问题。

【讨论】:

以上是关于从字符串中获取特定字符并将它们附加到列表中的主要内容,如果未能解决你的问题,请参考以下文章

如何从字符串中获取子字符串并将另一个字符串附加到字符串并将其转换为数组

Java - 如何获取字符串中特定字符的所有出现并将它们转移到非预定义位置?

AIX:查找名称包含特定字符串的文件并将其添加到列表中

如何从字典中检查特定字符串的键[重复]

如何从 simplejdbctemplate 查询中获取字符串列表或类型 T?

如何从一个表列中获取值,将它们与字符串连接并将它们插入另一个表中?