正则捕获集团

时间:2019-12-13 21:08:23

标签: python regex regex-group

说我有这个虚拟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\._(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+))

enter image description here

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

2 个答案:

答案 0 :(得分:2)

您可以匹配第一个植物,并使用问号非捕获组const array = [12,23,43,45,34,22,77]; const element = array.sort(() => Math.random() - Math.random()) .find(() => true); console.log(element);

使第二,第三和第四个植物成为可选植物

除了使用(?:..)?来代替不必要的回溯外,您还可以匹配点和1+个数字,而不是使用.*

\.\d+

Regex demo


另一种选择是解析URL,如果您已经知道它是(flowers\.com)\/compare\._([^.]+)\.([^.]+)\.\d+(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)? URL并获取 path 。如果花朵的各个部分以相同的方式构造,则也可以使用模式flowers.com

的单个部分

Python demo

例如

_([^.]+)\.([^.]+)\.\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))

答案 1 :(得分:2)

对于任何数量的植物:

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