python - [FORKING]Python 正则表达式 - Re.Sub 和 Re.Findall 有趣的挑战
问题描述
不确定这是否应该是赏金。我只是想更好地理解正则表达式。
我检查了Regex 中的响应以匹配 pattern.one 跳过换行符和字符,直到 pattern.two和Regex 匹配,如果没有找到给定的文本并匹配尽可能少的线程并阅读RexEggTempered Greedy Token Solutions
和Explicit 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]+)
但我想看看是否有一个额外的指令可以用来使正则表达式拒绝这两个通常会捕获的某些字符。
解决方案
根据请求发布:
(?:(?!/)[\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]
)*
推荐阅读
- android - 如何在 React Native 中隐藏渲染元素?
- node.js - 有没有办法在 facebook messenger 聊天机器人上设置 cookie?
- css - 如何在 Rmarkdown Xaringan 代码块中包含不匹配的“]”?
- javascript - 链接预览不适用于 Telegram 和 Whatsapp
- ios - 如何使用 react-native-sensors 或 expo-sensor 计算 React Native 中的总旋转角度或旋转计数?
- amazon-web-services - 如何使用 ssh 凭证连接到 AWS CodeCommit?
- javascript - 如何为 chrome 扩展开发添加 react-devtools?
- android - 我在 LocationResult 中发现 @RecentlyNonNull 与代码相矛盾,我应该相信哪个?
- postgresql - 固定精度交叉点抱怨我需要 GEOS 3.9 或更高版本,但 PostGIS_GEOS_Version() 是 3.9
- python - Python Flask 登录 Current_User 并不总是可用