不确定这是否应该成为赏金。我只是想更好地了解正则表达式。
我检查了Regex to match pattern.one skip newlines and characters until pattern.two和Regex to match if given text is not found and match as little as possible线程中的响应,并在RexEgg上阅读了有关Tempered Greedy Token Solutions
和Explicit Greedy Alternation Solutions
的信息,但坦白地说,这些解释使我感到困惑。
我花了最后一天主要摆弄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'
有条件的所需输出(!!)
tax-march-donald-trump-protest-
条件:必须使用交替的捕获组,这些捕获组必须捕获([\S]+)
或([\S]+?)/
来捕获其他组,但是如果它们不包含-
,则忽略它们。
我很清楚,最好使用re.findall('([\-]*(?:[^/]+?\-)+)[\d]+', string)
或类似的名称,但我想知道是否可以使用[\S]+
或([\S]+)
或{{1 }},并告诉正则表达式,如果捕获了这些,则忽略包含([\S]+?)/
或不包含/
的结果,同时也使用了交替捕获组
我知道我不需要使用-
或[\S]+
,但是我想看看是否还有其他指令可用于使regex拒绝这两个字符会拒绝的某些字符通常会捕获。
答案 0 :(得分:2)
按请求发布:
(?:(?!/)[\S])*-(?:(?!/)[\S])*
https://regex101.com/r/azrwjO/1
解释
(?: # 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]
)*
答案 1 :(得分:1)