Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式捕获组_Python_Regex_Regex Group - Fatal编程技术网

Python 正则表达式捕获组

Python 正则表达式捕获组,python,regex,regex-group,Python,Regex,Regex Group,假设我有这个虚拟URL,我需要提取植物及其颜色作为捕获组 https://flowers.com/compare._plant1.green.402992_plant2.yellow.402228_plant3.red.403010_plant4.orange.399987.html 下面的regexI已经按照预期捕获了我需要的元素,但是当URL中的植物少于4个时,就无法捕获任何内容。底部有一个指向regex测试仪的链接,其中包含示例代码和URL,您可以使用它们 我如何修改这个正则表达式,使其

假设我有这个虚拟URL,我需要提取植物及其颜色作为
捕获组

https://flowers.com/compare._plant1.green.402992_plant2.yellow.402228_plant3.red.403010_plant4.orange.399987.html
下面的
regex
I已经按照预期捕获了我需要的元素,但是当URL中的植物少于4个时,就无法捕获任何内容。底部有一个指向regex测试仪的链接,其中包含示例代码和URL,您可以使用它们

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


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

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

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


另一个选项是,如果您已经知道url是
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')]

对于任何数量的工厂:

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

除了非常感谢的第一个选项外,所有选项都是可选的!!
plant1 green
plant2 yellow
plant3 red
plant4 orange