代码之家  ›  专栏  ›  技术社区  ›  keithpjolley

python regex if | else不按广告那样工作?[副本]

  •  -1
  • keithpjolley  · 技术社区  · 6 年前

    if|else 模式匹配在python中工作,因此从 documentation . 据我所知,这是不工作的每一个文件,但我已经学会了假设我错过了一个关键步骤的地方。

    应该 失败,因为它缺少结束符“>”。

    In [1]: import re, sys
    In [2]: regex = re.compile('(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)')
    In [3]: cases  = ['<user@host.com>', 'user@host.com', '<user@host.com', 'user@host.com>']
    
    In [4]: [ re.search(regex, _) and ("match:", _) or ("fail:", _) for _ in cases ]
    Out[4]:
    [('match:', '<user@host.com>'),
     ('match:', 'user@host.com'),
     ('match:', '<user@host.com'),
     ('fail:', 'user@host.com>')]
    
    In [5]: sys.version
    Out[5]: '3.6.5 |Anaconda custom (64-bit)| (default, Apr 26 2018, 08:42:37) \n[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]'
    

    (?(id/name)yes-pattern|no-pattern)

    将尝试匹配 yes-pattern 如果具有给定id或名称的组存在,并且没有模式,则 no-pattern (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$) 是一个糟糕的电子邮件匹配模式, 它将与' <user@host.com> “以及” user@host.com 但不是用 <user@host.com “也不是” user@host.com> '.

    所以我的问题是,我错过了哪一步?在不同的python版本和hosts/os上试用过。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Aran-Fey Swapnil    6 年前

    你用的是 search ,询问字符串 包含 与正则表达式匹配,而不是询问是否匹配 <user@host.com 包含匹配项,特别是 user@host.com .

    使用 fullmatch 而不是 搜索 .