0

我搜索了其他各种帖子,虽然有一些有用的提示,但我没有发现与我类似的问题,所以我想我会问。我生成了以下列表:

data2 = ['AN1_OUT,24','AN2_OUT,13','AN3_OUT,14','AN4_OUT,15']

我想要做的是识别设置(AN1_OUT 等)和伴随它的值(2,13 等)。我已经通过使用旧的“if-elif”成功地识别了该设置,因为我只需要知道这个设置,但是,我现在需要分离出这个值。到目前为止,我正在使用:

data3 = re.findall('[0-9]{2}',data2[i])
byte1 = map(lambda n: int(n[:2]),data3)

这是一个 for 循环,它遍历 data2 列表中的所有元素(本例中为 4 个)。对于每个“我”,我得到以下信息:

[24]
[13]
[14]
[15]

我知道这是我所期望的,但是,当值是单个数字时会出现问题,例如:

'AN1_OUT,2' 

在这种情况下,我错过了那个值并且它没有被打印出来。我尝试将 data3 函数中的正则表达式更改为:

data3 = re.findall('[0-9]{1,2}',data2[i])

然而,问题在于它会在 AN1_OUT、AN2_OUT 等中获取数字。所以我最终得到:

[1,2]
[2,13]
[3,14]
[4,15]

我已经研究了各种不同的方法来解决它,但事实证明它非常难以捉摸。任何帮助,将不胜感激。

4

3 回答 3

2

在末尾追加$以使其仅在输入字符串的末尾匹配:

'[0-9]{1,2}$'

您可以使用\d代替[0-9]

'\\d{1,2}$'

为避免转义,请使用原始字符串 ( r'raw string'):

r'\d{1,2}$'

>>> re.findall(r'\d{1,2}$', 'AN3_OUT,14')
['14']

>>> re.findall(r'\d+$', 'AN3_OUT,14')
['14']
于 2013-09-19T16:19:54.743 回答
1

您可以使用look-behind 来获取以逗号开头的数字。此外,您可以使用[0-9]+而不是[0-9]{1,2}, id 您可以有更多的数字。

data3 = re.findall(r'(?<=,)[0-9]+',data2[i])
于 2013-09-19T16:21:16.403 回答
0

您可以在不使用正则表达式的情况下解析您描述的字符串。用逗号分开!

for item in data2:
    setting, value = item.split(',')
    if setting == 'AN1_OUT':
        value = int(value)
        # do stuff with value
于 2013-09-19T16:36:58.493 回答