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

时间:2019-08-15 07:32:46

标签: python regex

我是Regex的新手,并尝试从字符串列表中提取一个16x字符的文本。

样品清单:

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

有什么想法吗?

非常感谢

5 个答案:

答案 0 :(得分:1)

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

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

\b“单词边界”运算符在一个位置上匹配,该位置的一侧被字母包围,而另一侧被非字母包围。

((如果您想更确切地了解哪些非字母顺序,可以使用环顾四周:

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

其中(?<!...)“不能在...之后,而(?!...)”不能在...之后“ 。 )

您还将注意到,我收紧了字符类,使其仅匹配十六进制数字,这本身已经足以解决您的示例问题,并对正则表达式使用了r'...'原始字符串,您可能应该这样做总是这样做(至少直到您完全了解Python非原始字符串中的反斜杠是如何变形的为止)。

答案 1 :(得分:0)

使用正则表达式集

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

这将搜索具有任何数字(\ d),“ A”,“ B”,“ C”,“ D”,“ E”或“ F”的任意16个长度的字符串

答案 2 :(得分:0)

在正则表达式中更具体:告诉您您所知道的!

如果您显然意识到实际结果与预期结果有所不同,请尝试从中获得好处。

\w匹配字母([A-Za-z],数字([0-9])和_,您似乎正在搜索16个十六进制数字。建立一个特定的character class

另一种观察结果是您希望将16进制数字块括在空格中,这可以通过捕获部分befor(capt)after周围的字符正则表达式或通过添加anchors/boundaries来表示。

答案 3 :(得分:0)

您可以尝试此操作,假设十六进制代码始终以UnReg开头

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

答案 4 :(得分:0)

使用re.findall避免for循环。我会在模式中指定UnReg(如果您的真实数据中有一个),那么正则表达式将不包含其他16个字符的文本。

>>> import re
>>> newArr = re.findall(r'UnReg\s(.{16})', ' '.join(myString))
>>> print(newArr)
['5A594F4380661123', '5A594F43805FA456', '4244434D73B24789', '5A594F43805FB000']