说我有这个虚拟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\._(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+)).*_(?:([^.]+)\.([^.]+))
答案 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+
另一种选择是解析URL,如果您已经知道它是(flowers\.com)\/compare\._([^.]+)\.([^.]+)\.\d+(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?(?:_([^.]+)\.([^.]+)\.\d+)?
URL并获取 path 。如果花朵的各个部分以相同的方式构造,则也可以使用模式flowers.com
例如
_([^.]+)\.([^.]+)\.\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