Python 用于有条件提取命名组的正则表达式

Python 用于有条件提取命名组的正则表达式,python,regex,Python,Regex,我需要编写python风格的正则表达式来有条件地提取字段。以下是我需要从中提取的两种类型的测试字符串: http://domain/string1/path/field_to_extract/path/filename http://domain/string2/path/90020_10029/path/filename 以下是我的要求: 对于string2,我们应该只选择第四个位置的数字,在斜杠(/)和(41;之间 对于其他人,我们应该在第四个位置的斜杠(/)之间选择整个文本 我编写了

我需要编写python风格的正则表达式来有条件地提取字段。以下是我需要从中提取的两种类型的测试字符串:

 http://domain/string1/path/field_to_extract/path/filename
 http://domain/string2/path/90020_10029/path/filename
以下是我的要求:

  • 对于string2,我们应该只选择第四个位置的数字,在斜杠(/)和(41;之间
  • 对于其他人,我们应该在第四个位置的斜杠(/)之间选择整个文本
  • 我编写了以下正则表达式:

    (?i)^(?:[^ ]*(?: {1,2})){6}(?:[a-z]+://)(?:[^ /:]+[^ /]/:]+[^ /]+/[^ /]+/)?(?:[^ /]+/){2}(?P<field_name>(?<=/string2/)(?:[^/]+/)([^_]+)|((?<!/string2/)(?:[^/]+/)([^/]+)))
    
    (?i)^(?:[^]*(?:{1,2})){6}(?[a-z]+://)(?:[^/:]+[^/]/:]+[^/]+/[^/]+/)?(?:[^/]+/){2}(?P(?)?
    尽管条件提取似乎工作正常,但此正则表达式也与提取字段之前的字符串匹配。例如,在第一个测试字符串上使用时,此正则表达式与
    path/field_to_extract
    匹配,在第二个测试字符串上与
    path/90020
    匹配

    虽然我在必填字段之前向组中添加了ignore,但它似乎不起作用


    请帮助我正确使用正则表达式。

    使用
    split()
    而不是complegex如何:-

    s          = 'thelink'.split('/')
    if len(s) > 4:
       string1or2 = s[3]
       field      = s[5]
    
       if string1or2 == 'string2':
           print field.split('_')[0]
    else:
       raise ValueError("Incorrect URL")
    

    尝试使用模式
    '/[^/]+/[^/]+/[^/]+/(\d+(?=)|[^/]+)”
    正则表达式解决方案:

    import re
    
    urls = [
        r'''http://domain/string1/path/field_to_extract/path/filename''',
        r'''http://domain/string2/path/90020_10029/path/filename'''
    ]
    
    for url in urls:
        print(re.search(r'(?<![:/])/(?:(string2)|[^/]*)/[^/]*/((?(1)[^_]*|[^/]*))', url).group(2))
    

    你也可以在第二种情况下使用split。我已经编辑了你的脚本,以避免出现一些异常(例如,id链接不包含斜杠),谢谢@Eric.EditedTanks的回答edit@Maximelrant。以前从未见过有人这么麻烦:)你可以将
    [^/]+/[^/]+/[^/]+/
    简化为
    (?:[^/]+/]{3}
    field_to_extract
    90020