作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个字符串,可以通过以下方式进行说明(有意使用额外空格):
"words that don't matter START some words one some words two some words three END words that don't matter"
为了获取 START 和 END 之间的每个子字符串['some Words one', some Words Two', 'some Words Three']
,我编写了以下代码:
result = re.search(r'(?<=START).*?(?=END)', string, flags=re.S).group()
result = re.findall(r'(\(?\w+(?:\s\w+)*\)?)', result)
是否可以通过一个正则表达式来实现这一目标?
最佳答案
理论上,您可以将第二个正则表达式包装在 ()*
中,然后将其放入第一个正则表达式中。这将捕获你内心表达的所有发生的范围。不幸的是,Python 实现仅保留多次匹配的组中的最后一个匹配项。据我所知,保留一组所有匹配的唯一实现是 .NET 实现。不幸的是,这不是您的解决方案。
另一方面,为什么你不能简单地保留现有的两步方法?
<小时/>编辑:您可以使用在线正则表达式工具比较我描述的行为。
模式:(\w+\s*)*
输入:aaa bbb ccc
例如尝试使用 https://pythex.org/和 http://regexstorm.net/tester 。您将看到 Python 返回一个匹配/组,即 ccc
,而 .NET 返回 $1
作为三个捕获 aaa、bbb、ccc
.
Edit2:正如 @Jan 所说,还有支持多重捕获的较新的 regex
模块。我完全忘记了这一点。
关于python - 使用 Python 的正则表达式 : findall inside a boundry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46507771/
我是一名优秀的程序员,十分优秀!