从字符串中提取特定文本的正则表达式

2024-05-06 04:17:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Regex新手,尝试从字符串列表中提取一段16个字符的文本。你知道吗

样本列表:

myString = ['  pon-3-1    |    UnReg 5A594F4380661123           1234567890               Active',
            '  pon-3-1    |    UnReg 5A594F43805FA456           1234567890               Active',
            '  pon-3-1    |    UnReg 4244434D73B24789           1234567890               Active', 
            '  pon-3-1    |    UnReg 5A594F43805FB000           1234567890               Active',
            'sw-frombananaramatoyourmama-01'
           ]

我不能使用像(\w{16})这样的简单正则表达式,因为这将包含所有16个字符的文本。 我还尝试了(\w+A),根据字符串中的字符,它不会返回正确的结果。你知道吗

newArry = []
for i in myString:
   number = re.search('(\w{16})', i)
   newArr.append(number[0])

print(newArr)

退货:

['5A594F4380661123', '5A594F43805FA456', '4244434D73B24789', '5A594F43805FB000', 'frombananaramato']
  1. 我只想提取:
    • 5A594F4380661123型
    • 5A594F43805FA456型
    • 4244434D73B24789
    • 5A594F43805FB000型

有什么想法吗?你知道吗

非常感谢


Tags: 字符串文本number列表swregexactive样本
3条回答

您可以尝试这样做,假设十六进制代码的前面总是UnReg

re.findall(r'UnReg\s+([\dA-F]{16})',';'.join(myString))

如果要确保16个字符被非字母环绕,请尝试

re.search(r'\b([0-9A-F]{16})\b', i)

\b“word boundary”操作符在一个位置上匹配,该位置的一侧由字母组成,另一侧由非字母组成。你知道吗

(如果您想更具体地了解哪些非阿尔卑斯人,您可以使用lookarounds:

re.search(r'(?<![0-9A-F])([0-9A-F]{16})(?![0-9A-F])', i)

其中(?<!...)表示“不能后跟…”(?!...)表示“不能后跟…”

您还将注意到,我将character类收紧为只匹配十六进制数字,这本身就足以解决您的示例问题,并将r'...'原始字符串用于正则表达式,您可能应该始终这样做(至少在您完全理解Python非原始字符串中的反斜杠是如何损坏的之前)。你知道吗

使用正则表达式集

number = re.search("([\dABCDEF]{16})", i)

这将搜索具有任何数字(\d)、'A'、'B'、'C'、'd'、'E'或'F'的任何16长度字符串

相关问题 更多 >