我是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']
有什么想法吗?
非常感谢
答案 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']