字符串正则匹配连续字符序列

3

设置

我有一组大量的产品图片,其中一些在文件名中包含产品的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'


2
SKU名称是字符串的一部分,对吗?尝试使用if re.search(r'(?<!\d)[0-9]{5}_[0-9]{2}(?!\d)', image): - Wiktor Stribiżew
@WiktorStribiżew,你太棒了。所以如果它在字符串内部,我需要使用re.search而不是re.match - LucSpan
是的。现在的问题是,如果您有FINAL 2310008_0231_angle.jpeg,您是否希望将其返回为匹配项? - Wiktor Stribiżew
不,我不想要那个 :-) - LucSpan
2个回答

2
^[0-9]{5}-[0-9]{2}$模式不会匹配任何字符串,因为其中的$锚点要求字符串结束,但是还有更多的字符需要匹配(_,然后是字符串的开始,2个数字和再次的字符串结束)。
您需要修复正则表达式模式以匹配没有包含数字的<5位数字>-<2位数字>子字符串,并使用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)

谢谢!也许这有点超出问题的范围,但如果SKU在名称中,我也可以让它打印出来吗?所以如果 image='FINAL 10008_01_angle.jpeg' 那么它会打印出 '10008_01' 吗? - LucSpan
抱歉再次打扰您。我发现文件名类似于 'FINAL 77718_02.jpeg' 的图像没有被匹配。我想这是因为 (?!\d) 负向先行断言的原因? - LucSpan

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接