分享
为什么问答平台  ›  专栏  ›  技术社区  ›  Kong

regex未检测到句点和数字[重复] - regex not detecting period and digit [duplicate]

  •  2
  • Kong  · 技术社区  · 6 天前

    这个问题已经有了答案:

    我在读到关于雷杰克斯的文章 https://medium.com/tech-tajawal/regular-expressions-the-last-guide-6800283ac034 但是我很难做一些简单的事情。

    s = re.compile('(norm|conv)[.][0-9]')
    
    for k,v in densenet_state_dict.items():
        print(k)
        print(s.findall(k))
    

    它应该印一些像 norm.2 但它只检测输出中的norm或conv,而不是周期或数字。

    module.features.denseblock4.denselayer16.norm.2.running_mean
    ['norm']
    module.features.denseblock4.denselayer16.norm.2.running_var
    ['norm']
    

    我甚至试过 '(norm|conv)\.[0-9]' . 我错过了什么很重要的东西吗?


    编辑:最小工作示例

    module_type = re.compile('(norm|conv)\.[0-9]')
    module_name = "module.features.denseblock4.denselayer16.conv.2.weight"
    print(module_name)
    print(module_type.findall(module_name))
    

    印刷品

    module.features.denseblock4.denselayer16.conv.2.weight
    ['conv']
    
    2 回复  |  直到 6 天前
        1
  •  1
  •   ggorlen    6 天前

    你的第二个瑞格鞋看起来不错。如果它没有捕获您想要的,请尝试:

    r'((?:norm|conv)\.[0-9])'
    

    去捕捉整件事( ?: 是非捕获组)。下面是一个例子:

    import re
    
    s = """module.features.denseblock4.denselayer16.norm.2.running_mean
    ['norm']
    module.features.denseblock4.denselayer16.norm.2.running_var
    ['norm']
    """
    
    print(re.findall(r'((?:norm|conv)\.[0-9])', s)) # => ['norm.2', 'norm.2']
    
        2
  •  1
  •   Emma    6 天前

    此表达式可能只是用捕获组提取所需的输出:

    (norm\[0-9]+conv\[0-9]+)
    

    demo

    测试

    coding=utf8
    #上面的标记定义了此文档的编码,并与python 2.x兼容。
    
    导入RE
    
    regex=r”(标准值\[0-9]+转换\[0-9]+)
    
    test_str=(module.features.denseblock4.denselayer16.norm.2.running_mean\n)
    “module.features.denseblock4.denselayer16.norm.2.运行变量\n”
    “module.features.denseblock4.denselayer16.conv.2121.running_mean\n”
    “module.features.denseblock4.denselayer16.conv.21341.running_var”)。
    
    匹配=re.finditer(regex,test_str,re.multiline)
    
    对于matchnum,在enumerate(matches,start=1)中匹配:
    
    print(“在开始-结束:匹配”.格式(matchnum=matchnum,start=match.start(),end=match.end(),match=match.group()))
    
    对于范围(0,len(match.groups())中的groupnum:
    groupnum=groupnum+1
    
    print(“group groupnum位于start-end:group”.格式(groupnum=groupnum,start=match.start(groupnum),end=match.end(groupnum),group=match.group(groupnum)))
    
    #注意:为了与python 2.7兼容,请使用ur“”作为regex的前缀,使用u“”作为测试字符串和替换的前缀。
    

    Regex电路

    jex.im可视化正则表达式:

    试验

    # coding=utf8
    # the above tag defines encoding for this document and is for Python 2.x compatibility
    
    import re
    
    regex = r"(norm\.[0-9]+|conv\.[0-9]+)"
    
    test_str = ("module.features.denseblock4.denselayer16.norm.2.running_mean\n"
        "module.features.denseblock4.denselayer16.norm.2.running_var\n"
        "module.features.denseblock4.denselayer16.conv.2121.running_mean\n"
        "module.features.denseblock4.denselayer16.conv.21341.running_var")
    
    matches = re.finditer(regex, test_str, re.MULTILINE)
    
    for matchNum, match in enumerate(matches, start=1):
    
        print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
    
        for groupNum in range(0, len(match.groups())):
            groupNum = groupNum + 1
    
            print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
    
    # Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
    

    Regex电路

    jex.im可视化正则表达式:

    enter image description here