首页 > 解决方案 > [FORKING]Python 正则表达式 - Re.Sub 和 Re.Findall 有趣的挑战

问题描述

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

我检查了Regex 中的响应以匹配 pattern.one 跳过换行符和字符,直到 pattern.twoRegex 匹配,如果没有找到给定的文本并匹配尽可能少的线程并阅读RexEggTempered Greedy Token SolutionsExplicit Greedy Alternation Solutions关于 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'

给定条件所需的输出(!!)

tax-march-donald-trump-protest-

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

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

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

标签: pythonregexpython-3.x

解决方案


根据请求发布:

(?:(?!/)[\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] 
 )*

推荐阅读