Python 匹配正则表达式而不捕获

Python 匹配正则表达式而不捕获,python,regex,Python,Regex,我想用正则表达式提取一些模式。作为简化的示例,我在下面有几段文本,我希望在第二个字段中提取不带下划线的文本: main\u opt.otherstuff应返回三个字段:“main”,“opt”,“otherstuff” main.otherstuff应返回三个字段:“main”,“otherstuff” 如果我将正则表达式指定为^([^\u]+)?([^.]+)?\\\.(.+)$,则可以得到此结果。但是,我想知道是否可以更改此模式([^.]+)?,其中只指定了一个?,因为它们是同一子模式的一部

我想用正则表达式提取一些模式。作为简化的示例,我在下面有几段文本,我希望在第二个字段中提取不带下划线的文本:

  • main\u opt.otherstuff
    应返回三个字段:
    “main”
    “opt”
    “otherstuff”
  • main.otherstuff
    应返回三个字段:
    “main”
    “otherstuff”
  • 如果我将正则表达式指定为
    ^([^\u]+)?([^.]+)?\\\.(.+)$
    ,则可以得到此结果。但是,我想知道是否可以更改此模式
    ([^.]+)?
    ,其中只指定了一个
    ,因为它们是同一子模式的一部分


    我试过
    ([^.]+)((?=\\[^.]+)?\\.(.+)$
    ([^.]+)((?:\[^.]+)?\.(.+)$
    ,但第二个字段返回“\u opt”而不是“opt”。(我正在使用python的
    re
    包,如果有必要的话。)

    您可以将它们分组到非捕获组
    (?:…)
    ,但它不会比您的原始解决方案更漂亮:

    ^([^_]+)(?:_([^.]+))?\\.(.+)$
    

    在Python控制台上测试:

    >>> re.findall(r'^([^_]+)(?:_([^.]+))?\.(.+)$', "main_opt.otherstuff")
    [('main', 'opt', 'otherstuff')]
    >>> re.findall(r'^([^_]+)(?:_([^.]+))?\.(.+)$', "main.otherstuff")
    [('main', '', 'otherstuff')]
    

    拆分可能会简化方法:

    >>> re.split(r'_|\.', 'main_opt.otherstuff')
    ['main', 'opt', 'otherstuff']
    >>> re.split(r'_|\.', 'main.otherstuff')
    ['main', 'otherstuff']
    

    我认为不使用正则表达式,只需拆分两次,就可以更简单地实现这一点

    mainopt, _, otherstuff = wholething.partition('.')
    main, _, opt = mainopt.partition('_')
    
    以下是这对不同输入的作用:

    `"main_opt.otherstuff"` -> `"main"`, `"opt"`, `"otherstuff"`
    `"main.otherstuff"` -> `"main"`, `""`, `"otherstuff"`
    `"main_opt"` -> `"main"`, `"opt"`, `""`
    

    如果需要不同的优先级,可以更改顺序;如果需要不同的关联性,可以将一个或另一个
    分区
    调用替换为
    r分区
    (例如,如果最后一个示例应给出
    “main\u opt”
    ).

    regex101行为并不总是与实际行为相同。您应该使用python控制台进行测试。我仍然得到相同的结果。。。在控制台上添加了完整的结果,感谢您的反馈我相信(?:s)?他不想要一个空的第二个捕获组,但可能我还不太了解要求。我引用他的话:“main.otherstuff应该返回三个字段:“main”,“otherstuff”,“Ok,在这种情况下,您应该在第一个字符类中排除圆点,以使模式更具性能(减少回溯),为什么不呢,但是这并不能保证组数(少于4组,多于1组)。我请OP澄清他是否希望在所有情况下都有3组。也许我是个笨蛋,但这篇文章对我来说并不清楚。就像这里的很多帖子一样。
    “main”、“,”otherstuff”
    是想要的结果还是你只是在报告结果?@dawg:是的,这三个字段是我想要的结果。