[英]Regex on string to match sequence of characters
设定
我有一大套产品图片,其中一些产品的文件名为SKU。
我需要检查文件名是否包含产品的SKU。
所有SKU由5个数字,一个下划线和2个数字组成; 例如'10008_01'
, '23521_18'
等
我的代码
我正在使用我在这里找到的正则表达式设置:
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-9]{5}$_^[0-9]{2}$
模式将永远不会匹配任何字符串,因为$
anchor内部需要字符串的结尾,但是有更多的字符要匹配( _
,然后字符串的开头,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)
- (负向前瞻性含义)当前位置右侧必须没有数字。 看到这个正则表达式演示 。
要打印匹配使用
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)
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.