在python

时间:2017-02-20 23:57:15

标签: python

我在ATM上工作的东西有一个(有点)长串数据,如下所示:

56,1,0,153,0,0; ​​56,1,0,153,0,0; ​​56,1,0,153,0,0; ​​5,1,2,34,B_3_1_1,0; 5,1,2 ,34,C_9841,0;

我想查找以'C_'开头的值并返回其后的数字。我知道他们将永远处于由分号分隔的值列表的第四个位置。

我正在考虑使用正则表达式将字符串解析为列表并搜索所述列表,但不要认为这样会非常有效。

有人能指出我正确的方向来解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

您可以使用简单的re.findall()

import re

your_string = "56,1,0,153,0,0;56,1,0,153,0,0;56,1,0,153,0,0;5,1,2,34,B_3_1_1,0;5,1,2,34,C_9841,0;"

c_values = re.findall(r"C_(\d+)", your_string)  # ['9841']

编辑:如果您需要将数值作为数字,则可以将其转换为生成器:

c_values = [int(x) for x in re.findall(r"C_(\d+)", your_string)]  # [9841]

编辑#2:由于您似乎担心性能,几乎在所有情况下,正则表达式都是最快的方法。如果你计划在大量字符串(不是几个大字符串)上运行它,那么每一点都可能有帮助,所以首先编译你的正则表达式,然后在需要时调用它:

your_regex = re.compile(r"C_(\d+)")

# now use your_regex whenever you need it
c_values = your_regex.findall(your_string)  # ['9841']

答案 1 :(得分:0)

import re

long_str = "56,1,0,153,0,0;56,1,0,153,0,0;56,1,0,153,0,0;5,1,2,34,B_3_1_1,0;5,1,2,34,C_9841,0;"

splitted_str = re.split(';|,', long_str)   

print next(int(x[2:]) for x in splitted_str if x[:2] == "C_")

替代

long_str = "56,1,0,153,0,0;56,1,0,153,0,0;56,1,0,153,0,0;5,1,2,34,B_3_1_1,0;5,1,2,34,C_9841,0;"

split1 = long_str.split(';')

split2 = next(y for y in split1 if "C" in y)

print next(int(x[2:]) for x in split2.split(',') if x[:2] == "C_")

答案 2 :(得分:0)

一个简单的解决方案是使用.find方法。

instr = "56,1,0,153,0,0;56,1,0,153,0,0;56,1,0,153,0,0;5,1,2,34,B_3_1_1,0;5,1,2,34,C_9841,0;"

results = []
index = instr.find('C_')
while index >= 0:
    length = instr[index:].find(',')
    assert length > 0
    results.append(instr[index+2:index+length])
    instr = instr[index+length:]
    index = instr.find('C_')

另一种简单且可能更有效的方法是.split on" C _":

bits = instr.split('C_')[1:]
stops = [bit.find(',') for bit in bits]
results = [bit[2:stop] for bit, stop in zip(bits, stops) if stop > 0]

答案 3 :(得分:0)

假设:

s = '56,1,0,153,0,0;56,1,0,153,0,0;56,1,0,153,0,0;5,1,2,34,B_3_1_1,0;5,1,2,34,C_9841,0;'

对于避免正则表达式的单行程,这应该有效:

Python 2/3 - credit

next(i for sublist in (ss.split(',') for ss in s.split(';')) for i in sublist if i.startswith('C_'))[2:]

Python 3

import itertools # err... it becomes 3 lines

next(i for i in itertools.chain.from_iterable(
    ss.split(',') for ss in s.split(';')) if i.startswith('C_'))[2:]

然而,如果事情变得复杂,我自己更喜欢正则表达式。 现代规则规定不要过早优化"和#34;让你的代码可读"。