2

I have the following string:

background:url('http://images.bloomingdales.com/is/image/BLM/?&$b=BLM/swatches/&layer=0&size=322,23&src=is{$b$1/optimized/8757901_fpx.tif}&cropN=0,0,14,1&anchor=0,0&layer=1&size=23,23&src=is{$b$2/optimized/8757902_fpx.tif}&anchor=0,0&posN=0.071,0&layer=2&size=23,23&src=is{$b$4/optimized/8234544_fpx.tif}&anchor=0,0&posN=0.143,0&layer=3&size=23,23&src=is{$b$7/optimized/1111977_fpx.tif}&anchor=0,0&posN=0.214,0&layer=4&size=23,23&src=is{$b$0/optimized/8538460_fpx.tif}&anchor=0,0&posN=0.286,0&layer=5&size=23,23&src=is{$b$5/optimized/8234545_fpx.tif}&anchor=0,0&posN=0.357,0&layer=6&size=23,23&src=is{$b$3/optimized/1111973_fpx.tif}&anchor=0,0&posN=0.429,0&layer=7&size=23,23&src=is{$b$7/optimized/1252857_fpx.tif}&anchor=0,0&posN=0.5,0&layer=8&size=23,23&src=is{$b$8/optimized/1252858_fpx.tif}&anchor=0,0&posN=0.571,0&layer=9&size=23,23&src=is{$b$7/optimized/8234547_fpx.tif}&anchor=0,0&posN=0.643,0&layer=10&size=23,23&src=is{$b$0/optimized/8757900_fpx.tif}&anchor=0,0&posN=0.714,0&layer=11&size=23,23&src=is{$b$0/optimized/1111970_fpx.tif}&anchor=0,0&posN=0.786,0&layer=12&size=23,23&src=is{$b$1/optimized/1111971_fpx.tif}&anchor=0,0&posN=0.857,0&layer=13&size=23,23&src=is{$b$2/optimized/1111972_fpx.tif}&anchor=0,0&posN=0.929,0&layer=14&op_sharpen=1&fmt=jpeg&qlt=90,0&hei=23') 322px 0 transparent;

I need to get all such parts :

1/optimized/8757901_fpx.tif , 2/optimized/8757902_fpx.tif, etc..

I am using this regexp:

re.findall(re.compile(r'\d{1,2}/optimized/.+\.tif'), swatch)

Which returns a wrong result:

['1/optimized/8757901_fpx.tif}&cropN=0,0,14,1&anchor=0,0&layer=1&size=23,23&src=is{$b$2/optimized/8757902_fpx.tif}&anchor=0,0&posN=0.071,0&layer=2&size=23,23&src=is{$b$4/optimized/8234544_fpx.tif}&anchor=0,0&posN=0.143,0&layer=3&size=23,23&src=is{$b$7/optimized/1111977_fpx.tif}&anchor=0,0&posN=0.214,0&layer=4&size=23,23&src=is{$b$0/optimized/8538460_fpx.tif}&anchor=0,0&posN=0.286,0&layer=5&size=23,23&src=is{$b$5/optimized/8234545_fpx.tif}&anchor=0,0&posN=0.357,0&layer=6&size=23,23&src=is{$b$3/optimized/1111973_fpx.tif}&anchor=0,0&posN=0.429,0&layer=7&size=23,23&src=is{$b$7/optimized/1252857_fpx.tif}&anchor=0,0&posN=0.5,0&layer=8&size=23,23&src=is{$b$8/optimized/1252858_fpx.tif}&anchor=0,0&posN=0.571,0&layer=9&size=23,23&src=is{$b$7/optimized/8234547_fpx.tif}&anchor=0,0&posN=0.643,0&layer=10&size=23,23&src=is{$b$0/optimized/8757900_fpx.tif}&anchor=0,0&posN=0.714,0&layer=11&size=23,23&src=is{$b$0/optimized/1111970_fpx.tif}&anchor=0,0&posN=0.786,0&layer=12&size=23,23&src=is{$b$1/optimized/1111971_fpx.tif}&anchor=0,0&posN=0.857,0&layer=13&size=23,23&src=is{$b$2/optimized/1111972_fpx.tif']

I have tested this regexp on regex101.com and there it works well: https://regex101.com/r/tV9kU8/1#

3 Answers 3

3
re.findall(r'\d{1,2}/optimized/.+?\.tif', swatch)

                                            ^^

Make your quanitifer non greedy by appending ? to it.

Sign up to request clarification or add additional context in comments.

Comments

2

Instead of greedy .+, use the quantifier in ungreedy mode: .+?. This way your regex will never match more characters between the / and .tif than needed, i.e. it will only match up to the next instance of .tif.

Comments

1

You can use a none greedy grouping in your regex (Note that also in your pattern you need to put a ? after + to make it none greedy):

>>> re.findall(re.compile(r'{\$b\$(.*?)}'), s)
['1/optimized/8757901_fpx.tif', '2/optimized/8757902_fpx.tif', 
'4/optimized/8234544_fpx.tif', '7/optimized/1111977_fpx.tif', 
'0/optimized/8538460_fpx.tif', '5/optimized/8234545_fpx.tif', 
'3/optimized/1111973_fpx.tif', '7/optimized/1252857_fpx.tif', 
'8/optimized/1252858_fpx.tif', '7/optimized/8234547_fpx.tif', 
'0/optimized/8757900_fpx.tif', '0/optimized/1111970_fpx.tif', 
'1/optimized/1111971_fpx.tif', '2/optimized/1111972_fpx.tif']

As all of you image path is after \$b\$ you can use following pattern :

{\$b\$(.*?)}

that will match anything after \$b\$ within {}.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.