在字符串列表中查找精确匹配

8

我很新,请耐心等待...

我有一个预定义的单词列表

checklist = ['A','FOO']

并从 line.split() 获得一个单词列表,看起来像这样

words = ['fAr', 'near', 'A']

我需要在单词中寻找与“checklist”完全匹配的内容,这样我就只能找到“A”。
if checklist[0] in words:

这个方法不起作用,所以我尝试了一些我在这里找到的建议:

if re.search(r'\b'checklist[0]'\b', line): 

毫无用处,因为我显然不能像那样查找列表对象... 有什么帮助吗?

2
在这里使用正则表达式有些过头了,当你可以循环遍历数组并检查元素是否在预定义的数组中时。 - Tushar
3
“checklist[0]”已经在文字中了。你能具体说明一下它为什么“没有起作用”吗? - TigerhawkT3
1
那么你想做什么?你所说的“在字符串列表中查找精确匹配”是什么意思? - Remi Guan
抱歉表述不够准确,下次会更清晰地表达。压力。干杯。 - origamisven
4个回答

19

使用set比遍历列表要快得多。

checklist = ['A', 'FOO']
words = ['fAr', 'near', 'A']
matches = set(checklist).intersection(set(words))
print(matches)  # {'A'}

5

这将为您提供精确匹配列表。

matches = [c for c in checklist if c in words]

这与以下代码相同:

matches = []
for c in checklist:
  if c in words:
    matches.append(c)

3
这将不仅返回完全匹配项,还将返回部分匹配项。 - eDonkey
这个答案适用于返回部分匹配而不是精确匹配。 - A.M
@pushkin,部分匹配意味着如果你有一个列表 a = ['FOO', 'FOOL', 'A', 'B'] 并且只想在列表中查找字符串 FOO,你的代码将把 FOO 和 FOOL 都添加到匹配列表中,这意味着你的代码同时添加了精确匹配 ('FOO') 和部分匹配 ('FOOL'),问题是“在字符串列表中查找精确匹配” :) - A.M
@A.M 我不相信那是这样的。我正在对列表中的字符串进行匹配。这将返回精确匹配(请参见此处)。如果words在我的代码中本身就是一个字符串,那么in将执行子字符串匹配。我刚刚运行了这段代码,它只返回了精确匹配。 - pushkin
@JimArcher 你是根据什么来断定的?我刚刚尝试运行了类似于 a = ["ab"];print("a" in a) 的代码,结果返回了 False - pushkin
显示剩余4条评论

1

Set将满足您的需求。集合有一个issubset方法。示例如下:

checklist = ['A','FOO']
words = ['fAr', 'near', 'A']

print set(checklist).issubset(set(words))

如果您只需要测试两个列表中是否存在评论元素,则可以使用intersection方法进行更改。

如果你有大量的数据集,使用set方法比使用for循环要快得多,它们真的非常有效。 - CodeMonkey
这个方法不起作用。我得到了“False”,但应该得到“True”。 - user1261558

0

如果这对你有用,请告诉我,

In [67]: test = re.match(r"(.*?)A(.*?)$", "CAT")

代码相关内容:

In [68]: test.group(2)

Out[68]: 'T'

In [69]: test.group()

Out[69]: 'CAT'

In [70]: test.group(1)

Out[70]: 'C'

如果模式不匹配,则测试对象不存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接