python - 匹配两个通配符字符串

标签 python regex string

我刚刚学会了如何将字符串与通配符匹配(非常有帮助)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/

相关文章:

c++ - 使用 sed 或 awk 预处理 C/C++ 代码时如何定位可靠的函数?

javascript regexp - 用四舍五入的数字替换字符串中的所有 float

java - 获取 Java 导入语句的正则表达式

java - 比较字符串类型的日期

python - Networkx Python 中的权重相乘

python - 使用 R/igraph,有没有办法在考虑唯一节点属性的计数的情况下找到节点之间的最短路径?

python - 每个子图旁边的 plotly 图例,Python

python - 快速多项式移位

c# - 在 C# 中将字符串分成两个或多个部分

c++ - boost 字符串匹配 DFA