python - 正则表达式捕获组
问题描述
假设我有这个虚拟 URL,我需要将植物及其颜色提取为capture groups
https://flowers.com/compare._plant1.green.402992_plant2.yellow.402228_plant3.red.403010_plant4.orange.399987.html
我所拥有的以下内容regex
是按预期捕获我需要的元素,但是当我在 URL 中的植物少于 4 个时无法捕获任何内容。底部有一个正则表达式测试器的链接,其中包含您可以使用的示例代码和 URL。
如何修改此正则表达式以动态工作,以便在不需要静态 URL 结构的情况下捕获可用内容。现在,假设我最多只捕获 4 株植物(8 组)
(flowers\.com)\/compare\._(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+))
解决方案
您可以匹配第一个植物,并使用问号非捕获组使第二个、第三个和第四个可选(?:..)?
除了使用.*
你还可以匹配一个点和 1+ 个数字,而不是使用\.\d+
来防止不必要的回溯。
(flowers\.com)\/compare\._([^.]+)\.([^.]+)\.\d+(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?
如果您已经知道它是flowers.com
url 并获取路径,另一种选择是解析 url 。如果花朵的部分以相同的方式构造,您也可以使用图案的单个部分_([^.]+)\.([^.]+)\.\d+
例如
from urllib.parse import urlparse
import re
pattern = r"_([^.]+)\.([^.]+)\.\d+"
o = urlparse('https://flowers.com/compare._plant1.green.402992_plant2.yellow.402228_plant3.red.403010_plant4.orange.399987.html')
print(re.findall(pattern, o.path))
输出
[('plant1', 'green'), ('plant2', 'yellow'), ('plant3', 'red'), ('plant4', 'orange')]
推荐阅读
- python - Python BeautifulSoup - 通过返回“无”的 id 查找表
- npm - 为什么 NPM 总是抛出错误,不管命令是什么?
- ruby - Errno::ECONNREFUSED(无法打开到 :80 的 TCP 连接(连接被拒绝 - connect(2) 用于 nil 端口 80))
- python - 在子图上分别绘制图像的正像素和负像素
- javascript - 反应:在具有多个跨度元素的 div 中选择事件
- dynamics-crm - Opportunity 上更改的销售阶段未反映在图表和视图中 - CRM Online 9.0
- cytoscape.js - 如何将 Cytoscape.js 与打字稿一起使用
- c# - 为什么我在dotnet core中使用GZipStream解压时只得到前几行文件
- c# - 为什么我的 ReceivedBufferSize 很大?最多 65535 字节
- python - Raspistill:有些图片是黑色的