2016-08-04 92 views
2

我有一个来自excel的文本文件。我不知道如何在特定字符后取五位数字。提取文本文件中的数字

我想在文本文件中只输入#ACA后的5位数字。

我的文字是这样的:

ERROR_MESSAGE 
(((#ACA16018)|(#ACA16019))&(#AQV71767='')&(#AQV71765='2'))?1:((#AQV71765='4')?1:((#AQV71767$'')?(((#AQV71765='1')|(#AQV71765='3'))?1:'Hasar veya Lehe Hukuk seçebilirsiniz'):'Rücu sıra numarasını yazıp Hasar veya Lehe Hukuk seçebilirsiniz')) 
Rücu Oranı Girilmesi Zorunludur...' 
#ACA17660 
#ACA16560 
#ACA15623 
#ACA17804 
BU ALANI BOŞ GEÇEMEZSİNİZ.EKSPER RAPORU GELMEDEN DY YE GERİ GÖNDEREMEZSİNİZ. PERT İHBARI VARSA PERT ÇALINMA OPERASYONU AKTİVİTESİ OLUŞTURULMALIDIR. 
(#TSC[T008UNSMAS;FIRM_CODE=2 AND UNIT_TYPE='SG' AND UNIT_NO=#AQV71830]>0)?1:'Girdiğiniz değer fihristte yoktur' 
#ACA17602 
#ACA17604 
#ACA56169 
BU ALANI BOŞ GEÇEMEZSİNİZ 
#ACA17606 
#ACA17608 
(#AQV71835='')?'Boş geçilemez':1 
Lütfen Gönderilecek Kişinin Mail Adresini Giriniz ! ' 
LÜTFEN RED NEDENİNİ GİRİNİZ. 
EKSİK BİLGİ/BELGE ALANINA GİRMİŞ OLDUĞUNUZ DEĞER YANLIŞ VEYA GEÇERŞİZDİR!!! LÜTFEN KONTROL EDİP TEKRAR DENEYİNİZ.' 
BU ALAN BOŞ GEÇİLEMEZ. ÖDEME YAPILMADAN EK ÖDEME SÜRECİNİ BAŞLATAMAZSINIZ. 
ONAYLANDI VE REDDEDİLDİ SEÇENEKLERİNİ KULLANAMAZSINIZ 
BU ALAN BOŞ GEÇİLEMEZ.EVRAKLARINIZI , VARSA EKSPER RAPORUNU VE MUALLAĞI KONTROL EDİNİZ. 
Muallak Tutarını kontrol ediniz. 
'OTO BRANŞINDA REDDEDİLDİ NEDENİ SEÇMELİSİNİZ' 
'OTODIŞI BRANŞINDA REDDEDİLDİ NEDENİ SEÇMELİSİNİZ' 
(#AQV70003$'')?((#TSC[T001HASIHB;FIRM_CODE=#FP10100 AND COMPANY_CODE=2 AND CLAIM_NO=#AQV70003]$0)?1:'Bu dosya sistemde bulunmamaktadır'):'Bu alan boş geçilemez' 
(#AQV70503='')?'Bu alan boş geçilemez.':((#ACA18635=1)?1:'Mağdura ait uygun kriterli ödeme kaydı mevcut değildir.') 
(#AQV71809=0)?'Boş geçilemez':1 
(#FD101AQV71904_AFDS<0)?'Tarih bugünün tarihinden büyük olamaz 

我要抓住每一个5位数字,其自带#ACA后,所以:

160181601917660等..

回答

1

PowerShell的解决方案:

$contet = Get-Content -Raw 'your_file' 
$match = [regex]::Matches($contet, '#ACA(\d{5})') 
$match | ForEach-Object { 
    $_.Groups[1].Value 
} 

输出:

16018 
16019 
17660 
16560 
15623 
17804 
17602 
17604 
56169 
17606 
17608 
18635 
+0

非常感谢你多 –

+0

我运行yourscript.ps1后,如何uniq排序输出? –

+1

只需使用'|将结果传递给Sort cmdlet排序' –

2

这应该做它

import re 

print(re.findall("#ACA(\d+)",str_var)) 

如果你有在变量str_var

输出整段文字:

['16018', '16019', '17660', '16560', '15623', '17804', '17602', '17604', '56169', '17606', '17608', '18635'] 
2

re.findall(r'#ACA(\d{5})', str_var)

+0

非常感谢你 –

+0

非常感谢你 –

2

[x[:5] for x in content.split("#ACA")[1:]]

+0

非常感谢你 –

+1

不客气,但无需在每个地方都以'谢谢'来混乱帖子,通常认为人们很感恩; )或者,如果你真的'需要'感谢每个人,只是留下一般性意见:) – Julien

5
grep -oP '#ACA\K[0-9]{5}' file.txt 
  • #ACA\K如果需要的位数可变数目将匹配#ACA但不打印作为输出的一部分以下#ACA

  • [0-9]{5}五位数,使用

    grep -oP '#ACA\K[0-9]+' file.txt 
    
  • +0

    非常感谢你 –

    +0

    你也可以添加限制'5'的数字位数。 – Chaker

    +0

    将补充说,回答,谢谢 – Sundeep

    3

    如果你不知道或者不喜欢的正则表达式,你可以做到这一点,虽然代码是有点长:

    if __name__ == '__main__': 
        pattern = '#ACA' 
        filename = 'yourfile.txt' 
        res = list() 
        with open(filename, 'rb') as f: # open 'yourfile.txt' in byte-reading mode 
         for line in f: # for each line in the file 
          for s in line.split(pattern)[1:]: # split the line on '#ACA' 
           try: 
            nb = int(s[:5]) # take the first 5 characters after as an int 
            res.append(nb) # add it to the list of numbers we found 
           except (NameError, ValueError): # if conversion fails, that wasn't an int 
            pass 
        print res # if you want them in the same order as in the file 
        print sorted(res) # if you want them in ascending order