字符串上的正则表达式匹配字符序列

时间:2018-05-04 10:34:32

标签: python regex

设置向上

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

2 个答案:

答案 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)