2017-08-09 39 views
0

的数字我有以下内容的文件:查找文本

&ACCESS RVP1 
&REL 3 
&PARAM DISKPATH = KRC:\R1\Program\new 
DEF SETUP_WELD() 
;call LASER_EN(); 

$out[27]=false; START=OFF 
$out[26]=false; STROBE=OFF 
$out[25]=false; SELECT 8=OFF 
$out[24]=false; SELECT 7 =OFF 
$out[23]=false; SELECT 6 =OFF 
$out[22]=false; SELECT 5 =OFF 
$out[21]=false; SELECT 4 =OFF 
$out[20]=false; SELECT 3 =OFF 
$out[19]=false; SELECT 2 =OFF 
$out[18]=false; SELECT 1 =OFF 
$out[17]=false; SELECT 0 =OFF 
$out[28]=true; ENABLE=ON 

END 

我需要找到值,即在括号[],并将其写入到阵列。 在结果,我应该得到下一个结果:

[ '27', '26','25','24','23','22','21','20','19','18','17','28'] 

我有使用Python这样做。我对此很新,请问,给我一个提示什么是最恰当的方法?

我的想法是这样的:我文件读入到数组,然后我在想在数组元素使用搜索:

def reading(): 
    with open ('Setup_Weld.src') as f: 
     array1=[row.strip() for row in f] 

但我不知道如何在搜索元素数组。

UPD:找到了答案。工作代码为:

def reading(): 
    with open ('Setup_Weld.src') as f: 
     stripped=[row.strip() for row in f] 
     setup_weld_num = [re.search(r'\[(.*?)\]',i).group(1) for i in stripped if re.search(r'\[(.*?)\]',i)] 
     print(setup_weld_num) 
reading() 
+4

正则表达式是一些谷歌搜索的选项。向我们展示您尝试过的代码? –

+0

@Acapulka你的改变使得问题显得更加复杂并使现有答案失效。考虑恢复这些变化,并开始一个新的问题,你不知道如何处理额外的行。 – perigon

回答

0

尝试正则表达式,这是你想要的,

import re 
def reading(): 
    with open ('Setup_Weld.src') as f: 
     stripped=[row.strip() for row in f] 
     my_num_list = [re.search(br'\[(.*?)\]',i).group(1) for i in stripped if re.search(br'\[(.*?)\]',i)] 
     print(my_num_list) 
reading()   

python3输出,

[email protected]:~/Desktop$ python3 run.py 
[b'27', b'26', b'25', b'24', b'23', b'22', b'21', b'20', b'19', b'18', b'17', b'28'] 
[email protected]:~/Desktop$ 

这里是我的输出,

here is my output,

+0

尝试了您的代码,但它返回错误:TypeError:不能在类似字节的对象上使用字符串模式。我正在打开的文件不是.txt,但我认为这并不重要? – Acapulka

+1

@Acapulka为模式添加一个'b'前缀:'br'\ [[。*?] \]'' –

+0

似乎你正在使用python 3,因此做了2个更改,就像@DanD。 'br'和my_num_list = [re.search(br'\ [(。*?)\]',i).group(1)for f.readlines()] print(my_num_list) –

0

使用正则表达式

import re 
with open(file_name) as file_object: 
    data=file_object.read().replace('\n', '') 
    re.findall(r"\[(.*?)\]",data) 
+0

很好的答案。你可以尝试使用.readlines()而不是.read(),所以你不需要担心'\ n'替换 –

+0

.readlines()会给列表中的数据。通过这个我想获得一个字符串中的数据。 @MohideenibnMohammed –

+0

这可能会使用一些解释 – maestromusica

0

由于格式非常简单,您可以在不使用正则表达式的情况下使用Python的字符串方法。这里有一个适应你的开始:

def reading(): 
    with open ('Setup_Weld.src') as f: 
     array1=[row.strip() for row in f] 
     return [line[5:].split(']')[0] for line in array1] 

这将删除每行的前四个字符,然后保持该部分之前的右括号。

输出:

['27', '26', '25', '24', '23', '22', '21', '20', '19', '18', '17', '28'] 
+0

看起来像它的工作,但有些奇怪。我用这个:def reading(): with open('Setup_Weld.src')as f: array1 = [row.strip()for f] result = [line [5:]。split('] ')[0]用于array1中的行] print(result)并得到下一个输出: – Acapulka

+0

['SS RVP1','3','M DISKPATH = KRC:\\ R1 \\ Program \\ new','ETUP_WELD ()','LASER_EN()','','27','26','25','24','23','22','21','20','19', '18','17','28','',''] – Acapulka

+0

它会查找所有行..正则表达式将是一个更好的解决方案... OP要检查将具体行 –