在Python中比较两个字符串中的字符是否匹配

4
我正在尝试在Python中打印两组字符串之间共享的字符,我希望能够找到仅使用Python正则表达式来完成此操作的方法(因为我不懂正则表达式,所以现在是学习它的好时机)。
例如,如果first_word = "peepa"second_word = "poopa",那么我希望返回值为:"pa",因为在两个变量中,共享的字符是p和a。目前,我正在遵循有关如何使用re模块的文档,但似乎无法掌握其基本概念。
有任何想法可以解决这个问题吗?

3
如果第二个词是“pooblapa”,你是否仍希望它与“pa”匹配?也就是说,这些部分只有在它们出现在相同位置时才应匹配吗?另外,两个单词开头的“p”呢?请给出更多例子。同时,请勿使用正则表达式;这里无法使用。如果第二个词是“pooblapa”,您是否仍然希望它与“pa”匹配?即这些部分是否只有在它们出现在相同位置时才应该匹配?另外,两个单词开头的“p”怎么处理?请举一些更多的例子。此外,不要使用正则表达式,因为无法解决此问题。 - poke
能否将每个字符串视为一组字符,并找到这些集合的交集? - rayryeng
如果在这里加上 @poke,那么匹配的字符串将是 "opa",因为我想做的是打印两个字符串中共享的所有字符。 - Alex_adl04
@rayryeng 谢谢你为我澄清这个问题,Ray。我只是认为这是一个学习正则表达式的好机会,这个问题并不需要用那种方式解决。这是我的一个大佬时刻,因为我试图用一个与之无关的特定工具来解决问题。 - Alex_adl04
1
@Alex_adl04 - 我说得太早了。看起来有人向你展示了如何使用“正则表达式”,但他们使用了“sub”。它几乎可以做到你想要的,但匹配中存在一些重复项。顺便说一句,不用担心自己感觉像个新手。我们所有人都曾经历过那个阶段...我也承认我也有过我的公平份额!尝试想出完全新的解决方法总是很好的。这就是大多数事情的发明方式...它总是从试图突破我们已知边界开始。 - rayryeng
显示剩余2条评论
3个回答

9
这个问题似乎是想要找到两个字符串中相同字符的交集。最快速的方法是这样做:
>>> set(first_word).intersection(second_word)
set(['a', 'p'])

我认为正则表达式不适合解决这个问题。


我真的很喜欢这个,但是你能解释一下为什么在 second_word 上不需要使用 set() 吗? - Jose Magana
4
集合的 intersection 方法需要一个可迭代对象作为参数。字符串是可迭代的。 - Steve K
这实际上非常有用,我曾尝试使用正则表达式后使用set来绕过此问题,但结果很小。不过,我没想到可以使用交集。谢谢。 - Alex_adl04

4

使用集合。将字符串转换为集合会返回一个只包含唯一字母的可迭代对象。然后您可以检索两个集合的交集。

match = set(first_word.lower()) & set(second_word.lower())

1
哈哈哈,我刚留言就看见这个了。太赞了!+1 - rayryeng

2

使用正则表达式

这个问题非常适合使用集合解决。但是,您要求“只使用Python正则表达式进行操作。”

以下是一个开头:

>>> import re
>>> re.sub('[^peepa]', '', "poopa")
'ppa'

上面使用正则表达式从“poopa”中删除了所有不在“peepa”中的字母。(您会发现它保留了重复的字母,这是集合所不能做到的。)
更详细地说,re.sub基于正则表达式进行替换。[peepa]是一个正则表达式,表示任何字母peepa中的任一字母。正则表达式[^peepa]表示与peepa中任何字符不匹配。与此正则表达式匹配的任何内容都会被替换为空字符串"",也就是被删除。剩下的只有共同的字母。

我明白了,这是一个很好的例子。由于我正在尝试遵循惯例和最佳实践,因此我将把注意力集中在函数set的使用上(无意冒犯)。谢谢你提供这个很棒的例子,John。 - Alex_adl04

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