我在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_'开头的值并返回其后的数字。我知道他们将永远处于由分号分隔的值列表的第四个位置。
我正在考虑使用正则表达式将字符串解析为列表并搜索所述列表,但不要认为这样会非常有效。
有人能指出我正确的方向来解决这个问题吗?
答案 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;让你的代码可读"。