Python值提取,无需将每个值追加到列表中

Python值提取,无需将每个值追加到列表中,python,Python,我很好奇是否有一种我不熟悉的更简单的方法来做这件事。假设这是在一个网络上下文中,我希望从响应中提取值。这些值是几个用管道分隔的数值,例如| 103 | 28 | 48 | 12 | 47 | 54 |。我现在正在用这个 rep_pipe = e_traffic.replace("|", "||") extract_value = re.findall(r'\|([0-9]{2,3})\|', rep_pipe) 如果只有一个值的话,这是非常好的。它只对该字符串的一个实例运行良好的原因是,在这些

我很好奇是否有一种我不熟悉的更简单的方法来做这件事。假设这是在一个网络上下文中,我希望从响应中提取值。这些值是几个用管道分隔的数值,例如| 103 | 28 | 48 | 12 | 47 | 54 |。我现在正在用这个

rep_pipe = e_traffic.replace("|", "||")
extract_value = re.findall(r'\|([0-9]{2,3})\|', rep_pipe)
如果只有一个值的话,这是非常好的。它只对该字符串的一个实例运行良好的原因是,在这些管道之间找到的每个值都附加到一个列表中。然而,当一个响应中有几个字符串时,它们都被附加到同一个列表中,并且没有办法将它们彼此区分开来

假设我们有以下(十进制)值:

就目前情况而言,这将是[‘101’、‘102’、‘103’、‘110’、‘111’、‘94’、‘81’、‘120’]

有没有办法先将其转换为十六进制,然后保存为以下格式:

['6566676E6F', '5E5130206778']

可能需要注意的是,这些值显示在不同长度的不同偏移处,这在我看来有点困难。非常感谢您的帮助。

您可以使用
int
函数将整数的字符串表示形式转换为整数

您可以直接将小整数序列视为一个
字节
值,然后对其进行六进制处理,或者您也可以使用
'02X'
格式化每个小整数,然后将它们连接起来

您可以使用
finditer
而不是
findall
来迭代匹配项,而不必首先将它们放在列表中,但我不确定这能给您带来多少好处

综上所述:

extract_value = re.finditer(r'\|([0-9]{2,3})\|', rep_pipe)
buf = bytes(map(int, extract_value))
print(buf.hex())
但这只解决了你一半的问题。看起来您希望将每一行作为一个单独的字符串来处理,但在整个输入中使用了正则表达式。虽然可以使正则表达式和后处理更加复杂,但一次只执行一行可能更容易:

for line in rep_pipe:
    extract_value = re.findall(r'\|([0-9]{2,3})\|', line)
    buf = bytes(map(int, extract_value))
    print(buf.hex())

如果您有一个单字符分隔符(
|
),并且希望处理所有这样编码的数据,那么不需要正则表达式匹配来查找它。相反,只需使用
.split()
方法在分隔符处拆分字符串

如果您有多行文本数据,并且希望单独处理这些行,请使用
.splitlines()
方法获取它们

所以我们有

lines = e_traffic.splitlines()
data = [line.split('|') for line in lines]
数据
现在将是一个嵌套的字符串列表:

[['', '101', '102', '103', '110', '111', ''], ['', '94', '81', '48', '32', '103', '120', '']]
您可以使用
int()
函数将数字序列(仍然是字符串)转换为整数:

int_data = [[int(s) for s in line if s] for line in data]
bin_data = [bytes(seq) for seq in int_data]
(内部列表理解的
if s
部分删除每行的前导和结束
|
的空字符串。)

这为我们提供了
int\u数据中的整数嵌套列表:

[[101, 102, 103, 110, 111], [94, 81, 48, 32, 103, 120]]
可以使用
bytes()
函数将整数序列转换为二进制数据:

int_data = [[int(s) for s in line if s] for line in data]
bin_data = [bytes(seq) for seq in int_data]
最后,可以使用
bytes
类型的
.hex()
方法将二进制数据转换为其十六进制表示形式(再次转换为字符串):

hex_values = [b.hex() for b in bin_data]
现在我们有了一个字符串列表,其中包含
hex\u值

['6566676e6f', '5e5130206778']
或者,在一个表达式中包含上述所有内容 或者使用函数式的内部迭代:

hex_values = [
  bytes(
    map(int, filter(None, l.split('|')))
  ).hex() for l in e_traffic.splitlines()
]