正则表达式捕获组

Regex Capturing Group

假设我有这个假人 URL,我需要将植物及其颜色提取为 capture groups

https://flowers.com/compare._plant1.green.402992_plant2.yellow.402228_plant3.red.403010_plant4.orange.399987.html

我拥有的以下 regex 正在按预期捕获我需要的元素,但是当我在 URL 中的植物少于 4 株时无法捕获任何东西。在底部有一个正则表达式测试器的 link,带有示例代码和 URL 您可以玩。

如何修改此正则表达式使其动态工作,以便它捕获可用内容而不需要静态 URL 结构。现在,假设我最多只捕获 4 株植物(8 组)

(flowers\.com)\/compare\._(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+))

https://regex101.com/r/prjAO7/2

您可以匹配第一个植物,并使用问号非捕获组使第二个、第三个和第四个可选(?:..)?

除了使用 .*,您还可以使用 \.\d+ 来匹配一个点和 1+ 个数字,以防止不必要的回溯。

(flowers\.com)\/compare\._([^.]+)\.([^.]+)\.\d+(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?

Regex demo


另一个选项是解析 url 如果您已经知道它是 flowers.com url 并获取 路径 。如果花朵的部分以相同的方式构成,您也可以使用图案的单个部分 _([^.]+)\.([^.]+)\.\d+

Python demo

例如

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')]

对于任意数量的植物:

import re

url = 'https://flowers.com/compare._plant1.green.402992_plant2.yellow.402228_plant3.red.403010_plant4.orange.399987.html'
matches = re.finditer(r'(?:\d*_)([^.]+)\.([a-z]+)\.?', re.sub(r'.+\/flowers\.com\/compare\.', '', url))
for m in matches:
    print(m.group(1), m.group(2))

示例输出:

plant1 green
plant2 yellow
plant3 red
plant4 orange