【问题标题】:Wildcard matching in PythonPython中的通配符匹配
【发布时间】:2017-06-17 13:43:11
【问题描述】:

我有一个名为 Pattern 的类,其中有两个方法,equates 和 setwildcard。 Equates 返回子字符串第一次出现在字符串中的索引,setwildcard 设置子字符串中的通配符

所以

p = Pattern('xyz')
t = 'xxxxxyz'
p.equates(t)

返回 4

还有

p = Pattern('x*z', '*')
t = 'xxxxxgzx'
p.equates(t)

返回 4,因为 * 是通配符,可以匹配 t 内的任何字母,只要 x 和 z 匹配。 实现这一点的最佳方法是什么?

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 on topichow to ask 在这里申请。一般来说,解决此类问题的“正确”方法是实施 some 解决方案,然后在 CodeReview.StackExchange.com 上要求改进

标签: python string match wildcard matching


【解决方案1】:

看起来您实际上是在实现正则表达式的一个子集。幸运的是,Python 有一个内置的库!如果您不熟悉正则表达式(或者他们的朋友称之为正则表达式)的工作原理,我强烈建议您通读documentation for them

无论如何,我认为re.search 函数正是您正在寻找的。它的第一个参数是要匹配的模式,第二个参数是匹配它的字符串。如果模式匹配,search 返回一个 SRE_Match 对象,方便地,它有一个 @ 987654325@ 方法,返回匹配开始的索引。

要使用示例中的数据:

 import re
 start_index = re.search(r'x.z', 'xxxxxgzg').start()

请注意,在正则表达式中,. - 而不是 * - 是通配符,因此您必须在您使用的模式中替换它们。

【讨论】:

    【解决方案2】:

    正则表达式,就像公认的答案所暗示的那样,是处理问题的一种方法。虽然,如果您需要更简单的模式(例如 Unix shell 样式的通配符),那么 fnmatch 内置库可以提供帮助:

    表达式:

    • * - 匹配所有内容
    • ? - 匹配任何单个字符
    • [seq] - 匹配 seq 中的任何字符
    • [!seq] - 匹配任何不在seq 中的字符

    例如,尝试查找与localhost 匹配的任何内容:

    import fnmatch
    
    my_pattern = "http://localhost*"
    name_to_check = "http://localhost:8080"
    
    fnmatch.fnmatch(name_to_check, my_pattern) # True
    

    这样做的好处是/ 不被视为特殊字符,因此对于文件名/U​​RL 匹配,这非常有效,无需预先转义所有斜杠!

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      相关资源
      最近更新 更多