繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM