【问题标题】:[FORKING]Python Regex - Re.Sub and Re.Findall Interesting Challenges[FORKING]Python 正则表达式 - Re.Sub 和 Re.Findall 有趣的挑战
【发布时间】:2019-03-26 17:26:07
【问题描述】:

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

我查看了 Regex to match pattern.one skip newlines and characters until pattern.twoRegex to match if given text is not found and match as little as possible 线程中的回复,并在 RexEgg 上阅读了有关 Tempered Greedy Token SolutionsExplicit 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]+)([\S]+?)/ 并告诉正则表达式,如果那些被捕获,如果它包含/ 或不包含-,则忽略结果同时还使用了交替捕获组

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

【问题讨论】:

标签: python regex python-3.x


【解决方案1】:

根据请求发布:

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

【讨论】:

  • 非常感谢@sln。太棒了!
【解决方案2】:

你可以使用

/([-a-z]+)-\d+

并采取第一个捕获组,请参阅a demo on regex101.com

【讨论】:

  • 谢谢。我知道我可以使用它,但我真的想强制使用 "([\S]+?)/" 并强制它使用单个正则表达式语句排除捕获的不包含 "-" 的任何内容。我知道我什至不需要使用“[\S]+?”,但我希望它在那里看看我是否可以在正则表达式中使用额外的指令来强制它删除一些 [\S]+ 通常会捕获的内容寻找。但是,是的,我想强制它使用 "([\S]+?)/"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2013-11-19
  • 2018-10-02
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多