Python中如何比较字符串,类似于SQL中的“like”(使用“%”和“_”)?

24

我在Python中有一个包含一些字符串的列表,我需要知道列表中哪个项目与"A1_8301"相似。这个"_"代表可以是任何字符。

有没有快速的方法来做到这一点?

如果我使用SQL,我只需要输入类似于"where x like "A1_8301""这样的内容。

谢谢!

2个回答

18
在Python中,您可以使用正则表达式:
import re

pattern = re.compile(r'^A1.8301$')
matches = [x for x in yourlist if pattern.match(x)]

这将产生一个符合您要求的元素列表。

  • 需要使用^$锚点来防止子字符串匹配;例如,BA1k8301-42不应该匹配。但是,re.match()调用只会在测试字符串的开头进行匹配,但使用^会更加明确,并很好地反映了末尾锚点的$
  • 在SQL语句中,_被翻译为.,表示匹配任意一个字符

谢谢!非常喜欢这个解释。学到了一点正则表达式! - Antonio
有没有办法只使用一个字符串而不是列表来完成这个任务,还是我应该创建一个项目列表? - Antonio
@Antonio:你的意思是你有一个包含这些模式的更长字符串吗?然后移除 ^$ 锚点,使用 pattern.findall(longer_string);这将给你一个匹配列表。 - Martijn Pieters
没错,findall 是我需要的。谢谢。 - Antonio
如果有帮助的话,".." 匹配一个或多个任意字符,相当于 SQL 的 "%"。"." 匹配 0 或多个字符,".?" 匹配 0 或 1 个任意字符。 - VoteCoffee

5
正则表达式可能是解决问题的最佳方法。如果我没记错,%应该映射到.*,而_应该映射到.
matcher = re.compile('^A1.8301$')
list_of_string = [s for s in stringlist if matcher.match(s)]

好观点,尽管只是字符串开头的子串,因为我们使用的是re.match而不是re.search... 无论如何,我已经更新了。 - mgilson
是的,我加了它出于那个原因。 - mgilson

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