Python按字符串数组从字符串中提取标签

时间:2018-10-20 17:00:23

标签: python

我是python的新手,正在寻找帮助从字符串数组中提取标签的帮助。假设我有['python', 'c#', 'java', 'f#' ]

的字符串数组

然后输入"I love Java and python"的字符串。

输出应为数组['java', 'python']

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

不可通过空格分割

正则表达式解决方案

import re

stringarray = ['python', 'c#', 'core java', 'f#' ]
string = "I love Core Java and python"

pattern = '|'.join(stringarray)    
output = re.findall(pattern, string.lower())
# ['core java', 'python']

非正则表达式解决方案

stringarray = ['python', 'c#', 'core java', 'f#' ]
string = "I love Core Java and python"
output = [i for i in stringarray if i in string.lower()]
# ['core java', 'python']

可通过空格或其他字符拆分(快速!)

使用集合和交集

stringarray = ['python', 'c#', 'java', 'f#' ]
string = "I love Java and python"

output = list(set(string.lower().split()).intersection(stringarray))
# ['java', 'python']

简短说明::通过执行string.lower().split(),默认情况下(空白),将输入字符串中的单词分解为小写。通过将其转换为集合,我们可以访问集合函数交集。相交将依次找到两个集合中的事件。最后,我们将其包装在列表中以获得所需的输出。如Joe Iddon所评论,这将不会返回重复的标签。

计数

您对计数感兴趣吗?考虑使用collections计数器和dict理解:

from collections import Counter

count = {k:v for k,v in Counter(string.lower().split()).items() if k in stringarray}
print(count)
#{'java': 1, 'python': 1}

答案 1 :(得分:3)

您可以使用以下列表推导,将字符串转换为小写字母,然后遍历每个单词(使用split之后),然后返回数组中的单词:

arr = ['python', 'c#', 'java', 'f#' ]
s = "I love Java and python"

outp = [i for i in s.lower().split() if i in arr]

>>> outp
['java', 'python']

或者您可以使用正则表达式:

import re

arr = ['python', 'c#', 'java', 'f#' ]
s = "I love Java and python"

outp = re.findall('|'.join(arr),s.lower())

>>> outp 
['java', 'python']

答案 2 :(得分:2)

将标签列表变成一组,因此查找是普通情况下的O(1)查找,然后使用列表理解来执行O(1)标签搜索。

def extract(string, tags):
     tags = set(tags)
     return [w for w in string.lower().split() if w in tags]

和测试:

>>> extract('I love Java and python', ['python', 'c#', 'java', 'f#' ])
['java', 'python']