[FORKING]Python正则表达式-Re.Sub和Re.Findall有趣的挑战

[FORKING]Python正则表达式-Re.Sub和Re.Findall有趣的挑战,python,regex,python-3.x,Python,Regex,Python 3.x,我不确定这是不是一笔赏金。我只是想更好地理解正则表达式 我检查了和线程中的响应,并阅读了RexEgg上的调和贪婪令牌解决方案和显式贪婪交替解决方案,但无可否认,这些解释让我感到困惑 最后一天我主要是在摆弄re.sub(和findall),因为re.sub的行为对我来说很奇怪 问题1: 下面给定的字符串后跟字符/,如何生成一个使用交替捕获组的正则表达式(仅使用re.sub或re.findall),该捕获组必须使用[\S]+/来获得所需的输出 >>> string_1 = 'va

我不确定这是不是一笔赏金。我只是想更好地理解正则表达式

我检查了和线程中的响应,并阅读了RexEgg上的
调和贪婪令牌解决方案
显式贪婪交替解决方案
,但无可否认,这些解释让我感到困惑

最后一天我主要是在摆弄re.sub(和findall),因为re.sub的行为对我来说很奇怪

问题1:

下面给定的字符串后跟字符
/
,如何生成一个使用交替捕获组的正则表达式(仅使用re.sub或re.findall),该捕获组必须使用
[\S]+/
来获得所需的输出

>>> string_1 = 'variety.com/2017/biz/news/tax-march-donald-trump-protest-1202031487/'
>>> string_2 = 'variety.com/2017/biz/the/life/of/madam/green/news/tax-march-donald-trump-protest-1202031487/'
>>> string_3 = 'variety.com/2017/biz/the/life/of/news/tax-march-donald-trump-protest-1202031487/the/days/of/our/lives'
给定条件下的期望输出(!!)

条件:必须使用交替捕获组,该组必须捕获
([\S]+)
([\S]+?)/
以捕获其他组,但如果它们不包含
-

我很清楚使用
re.findall('([\-]*(?:[^/]+?\-+)[\d]+',string)
或类似的东西会更好,但我想知道我是否可以使用
[\S]+
([\S]+
([\S]+?)/
,并告诉regex如果这些被捕获,如果结果包含
/
或不包含
-
,同时还使用了交替捕获组,则忽略该结果

我知道我不需要使用
[\S]+
([\S]+)
,但我想看看是否有额外的指令可以用来让正则表达式拒绝这两个通常捕获的字符。

您可以使用

/([-a-z]+)-\d+
并获取第一个捕获组,请参见。

按请求发布:

(?:(?!/)[\S])*-(?:(?!/)[\S])*

解释

 (?:                           # Optional group
      (?! / )                       # Not a forward slash ahead
      [\S]                          # Not whitespace class
 )*                            # End group, do 0 to many times
 -                             # A dash must exist
 (?:                           # Optional group,  same as above
      (?! / )
      [\S] 
 )*

谢谢我知道我可以使用它,但我确实想强制使用“([\S]+?)/”并强制它使用单个正则表达式语句排除捕获的不包含“-”的任何内容。我知道我甚至不需要使用“[\S]+?”,但我想让它看看我是否可以在正则表达式中使用额外的指令来强制它删除[\S]+通常会找到的一些捕获。但是是的,我想强制它使用“([\S]+?)/”非常感谢@sln。令人惊叹的!!评论不用于扩展讨论;这段对话已经结束。
 (?:                           # Optional group
      (?! / )                       # Not a forward slash ahead
      [\S]                          # Not whitespace class
 )*                            # End group, do 0 to many times
 -                             # A dash must exist
 (?:                           # Optional group,  same as above
      (?! / )
      [\S] 
 )*