正则表达式捕获组
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\._(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+))
您可以匹配第一个植物,并使用问号非捕获组使第二个、第三个和第四个可选(?:..)?
除了使用 .*
,您还可以使用 \.\d+
来匹配一个点和 1+ 个数字,以防止不必要的回溯。
(flowers\.com)\/compare\._([^.]+)\.([^.]+)\.\d+(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?
另一个选项是解析 url 如果您已经知道它是 flowers.com
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
假设我有这个假人 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\._(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+))
您可以匹配第一个植物,并使用问号非捕获组使第二个、第三个和第四个可选(?:..)?
除了使用 .*
,您还可以使用 \.\d+
来匹配一个点和 1+ 个数字,以防止不必要的回溯。
(flowers\.com)\/compare\._([^.]+)\.([^.]+)\.\d+(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?
另一个选项是解析 url 如果您已经知道它是 flowers.com
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