【问题标题】:Pattern must succeed if only one slash is at the beginning如果开头只有一个斜线,则模式必须成功
【发布时间】:2015-09-29 10:29:47
【问题描述】:

这种模式有问题吗?

不能匹配

re.search('^/',"//abc"):
print"/------"

必须匹配

re.search('^/',"/abc"):
print"//------"  

【问题讨论】:

  • 在这两种情况下,您的模式都是“行首,斜线”。您的两个测试字符串在行首都有一个斜杠,这就是它们都匹配的原因。您是在问如何匹配“/...”而不是“//...”吗?换句话说,“斜线,后跟斜线以外的任何东西”?

标签: python regex python-2.7


【解决方案1】:

如果你想在开头匹配一个/

re.search('^/[^/]',"//abc")

^/[^/]' 将匹配以/ 开头的字符串,但前提是/ 后面没有另一个/^[] 内会否定匹配,所以如果你想忽略更多不止一个字符说出/?[ 你将创建集合[^/?] 所以"/?abc""//abc" 都不会匹配。

您正在匹配以/ 开头的任何字符串,因此在逻辑上它匹配两者。

如果您想获取整个字符串,而不仅仅是查看是否匹配:

re.search('^/[^/].*',"/abc")

如果您想要更具体的匹配,请在 [^/] 之后添加您想要的任何内容

【讨论】:

    【解决方案2】:

    最简单的方法是在第二个字符上否定 /。注意:您所拥有的 ^ 的含义是“在字符串的开头”。在字符范围内 [...] 它意味着除了那些字符。

    import re
    for s in ["//abc","/abc"]:
        #[^/] will match anything not a '/'
        pat = "^/[^/]"
        hit = re.search(pat, s)
        print "search(%s, %s)=>%s" % (pat,s,bool(hit))
    

    输出:

    search(^/[^/], //abc)=>False
    search(^/[^/], /abc)=>True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2015-03-15
      • 1970-01-01
      • 2022-11-01
      • 2019-12-24
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多