代码之家  ›  专栏  ›  技术社区  ›  William Lombard

计算机序列号的正则表达式。Python 2.7

  •  0
  • William Lombard  · 技术社区  · 7 年前

    我已经用这个做了很多搜索和实验!我相信这可能很简单。

    我使用Python扫描PDF的内容,读取我购买的机器的序列号。所有机器都用专用软件擦拭,文件第一行的最后一个“字”是序列号(过去是)。无需正则表达式即可轻松提取。现在,执行擦除的软件 有时 将序列号置于PDF的第二行。我想我可以使用一堆链接的“if”子句来绕过这个问题,但我宁愿使用regex。

    我使用的机器是戴尔、Mac和iPhone。DELL有7个大写字母数字“服务标签”/序列。Mac和iPhone可以是11或12个大写字母数字字符,具体取决于它们的制造时间。

    这就是我目前所拥有的。。。我有点担心“误报”的蔓延。序列号的验证基于长度。序列结果列表中还列出了软件的日期、时间和软件版本。

    output = convert_pdf_to_txt(file_name)
    
    # getting the serial by joining first two lines together, using a regex, adding to list, sorting list by len
    #assigning the longest result to the serial variable. this limits the scope of the search. fewer results to annoy me
    lines = output.splitlines()
    firstLine = lines[0]
    secondLine = lines[1]
    docHeader = str(firstLine) + str(secondLine)
    docHeader = str(docHeader)
    
    #regex to find alphanumeric words
    serialRegex = "(\w*\d[\w\d]+)"
    serialResults = re.findall(serialRegex, docHeader)
    sorted(serialResults, key=len)
    serial = serialResults[-1]
    

    到目前为止,我所做的测试已经就绪,但戴尔推出一些型号(字母数字)为8个字符的笔记本电脑,从而取代串行计算机,只是时间问题。。。只是大声思考。

    PDF文档顶部如何读取的示例。。。序列号(模糊)在这里的第二行。

    first two lines of PDF document, example

    当正则表达式以这些字符开头或结尾时,我的Python版本(2.7)似乎不会返回任何结果。

    ^ or $
    

    总之,当字符串包含长度为7、11或12个大写字符的字母数字单词时,如何编写只返回结果的正则表达式?

    谢谢 WL型

    1 回复  |  直到 7 年前
        1
  •  1
  •   bigeast    7 年前

    the offical doc shows ,您可以使用 {m,n} 要指定匹配的重复次数, \b 要匹配单词的开头或结尾,请执行以下操作:

    re.findall(r'\b[A-Z0-9]{7,7}\b', docHeader)
    

    同样的想法可以重复11次和12次。

    re.findall(r'\b[A-Z0-9]{11,11}\b', docHeader)
    re.findall(r'\b[A-Z0-9]{12,12}\b', docHeader)