我刚刚学会了如何将字符串与通配符匹配(非常有帮助)Python wildcard search in string
现在我正在尝试匹配两个都有通配符的字符串。
string1 = "spotify.us.*.uk"
string2 = "spotify.*.co.uk"
这两个字符串应该匹配。使用 *
将用作通配符。我在网上的研究表明没有解决方案。到目前为止我所拥有的(不起作用):
import re
string1 = "spotify.us.*.uk"
string2 = "spotify.*.co.uk"
r1 = string1.replace("*", ".*")
r2 = string2.replace("*", ".*")
regex1 = re.compile('.*'+r1)
regex2 = re.compile('.*'+r2)
matches = re.search(regex1, regex2)
我使用相同的概念来匹配字符串
和正则表达式
,这是可行的。但在两个字符串都有通配符的情况下它不起作用。任何帮助将不胜感激。
最佳答案
事实上,这两个字符串不应该是匹配的,因为正则表达式总是将模式与字符串进行比较。除了验证两个模式是否与公共(public)字符串匹配之外,不存在评估一个模式是否与另一个模式匹配之类的事情——这超出了语言的表达能力。
re.search()
将模式(作为编译模式或模式字符串)作为第一个参数,将字符串作为第二个参数。它返回该模式是否与该字符串匹配。传递两个模式将抛出 TypeError
现在假设您传入 re.search(regex1, r2)
它不会出错,但不会找到匹配项。为什么?那么 regex1='.*spotify.us..*.uk'
(就表达能力而言),这意味着“匹配包含任意数量非换行符的任何内容,后跟 spotify
,后跟任何单个(非换行)字符,后跟 us
,后跟两个或多个非换行字符,后跟 uk
。事实上,文字字符串spotify..*.co.uk
与此描述不匹配。
旁白:
考虑到 .
表示匹配任何非换行符,而 \.
表示匹配文字点,您可能想要类似的内容:
regex1 = "spotify\.us\..*\.uk"
regex2 = "spotify\..*\.co\.uk"
除了#2:
如果您仅使用通配符,fnmatch
(例如全局样式匹配)足以表达相同的模式,并且在这种情况下看起来更干净:
regex1 = "spotify.us.*.uk"
regex2 = "spotify.*.co.uk"
fnmatch.fnmatch('spotify.us.foo.uk', regex1)
# Output: True
关于python - 匹配两个通配符字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32513158/