Python 正则表达式捕获组
假设我有这个虚拟URL,我需要提取植物及其颜色作为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,您可以使用它们 我如何修改这个正则表达式,使其
捕获组
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