设置向上
我有大量的产品图片,其中一些产品的文件名中包含产品的SKU。
我需要检查文件名是否包含产品的SKU。
所有SKU由5个数字,一个下划线和2个数字组成;例如'10008_01'
,'23521_18'
等
我的代码
我使用正则表达式设置我找到here:
for image in product_image_list:
if re.match(r"^[0-9]{5}$" + '_' + r"^[0-9]{2}$", image):
print('Match: '+ image)
else:
print("NO match: " + image)
其中,
image
是图片文件的名称,例如'FINAL 10008_01_angle.jpeg'
或'FINAL 10008_detail_B.jpeg'
等product_image_list
是包含图片的列表。 问题
以上代码不匹配,只生成'No match'
。
如何让它正常工作?即我怎么得到:
'Match: FINAL 10008_01_angle.jpeg'
'No match: FINAL 10008_detail_B.jpeg'
答案 0 :(得分:2)
^[0-9]{5}$_^[0-9]{2}$
模式永远不会匹配任何字符串,因为内部的$
锚点需要字符串的结尾,但是有更多的字符要匹配(_
,然后是字符串的开头,2数字和字符串的结尾)。
您需要修复正则表达式模式以匹配没有封闭数字的<5-digit>-<2-digit>
子字符串,并使用带有re.search
方法的模式(因为re.match
仅在开始时搜索匹配项字符串):
if re.search(r'(?<!\d)[0-9]{5}_[0-9]{2}(?!\d)', image):
在这里,
(?<!\d)
- (负向后看)匹配字符串中不会紧跟数字的位置[0-9]{5}
- 5位数_
- 下划线[0-9]{2}
- 2位数(?!\d)
- (负面预测意思)当前位置右侧必须没有数字。请参阅this regex demo。
要打印匹配项,请使用
for image in product_image_list:
m = re.search(r'(?<!\d)[0-9]{5}_[0-9]{2}(?!\d)', image)
if m:
print('Matched SKU: {}'.format(m.group()))
else:
print("NO match found in '{}'.".format(image))
要匹配多个匹配项,请使用re.findall
:
re.findall(r'(?<!\d)[0-9]{5}_[0-9]{2}(?!\d)', image)
答案 1 :(得分:1)
re.match
查找完整的字符串匹配,这不是您想要的。你的正则表达式也比它需要的更复杂。以下应该有效。
import re
product_image_list = [
'FINAL 10008_01_angle.jpeg',
'FINAL 10008_detail_B.jpeg'
]
for image in product_image_list:
if re.search(r"[0-9]{5}_[0-9]{2}", image):
print('Match: '+ image)
else:
print("NO match: " + image)