简体   繁体   English

在文本文件中提取数字

[英]Extracting numbers in text file

I have a text file which came from excel. 我有一个来自excel的文本文件。 I dont know how to take five digits after a specific character. 我不知道如何在特定角色后取五位数。

I want to take only five digits after #ACA in a text file. 我想在文本文件中的#ACA之后只取五位数。

my text is like: 我的文字是这样的:

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

I want to take every 5 digits which comes after #ACA , so: 我想在#ACA之后取5位数,所以:

16018 , 16019 , 17660 , etc... 160181601917660 ,等...

grep -oP '#ACA\K[0-9]{5}' file.txt
  • #ACA\\K will match #ACA but not printed as part of output #ACA\\K将匹配#ACA但不作为输出的一部分打印
  • [0-9]{5} five digits following #ACA [0-9]{5} #ACA五位数

If variable number of digits are needed, use 如果需要可变位数,请使用

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

If you don't know or don't like regular expressions, you can do this, although the code is a bit longer : 如果你不知道或不喜欢正则表达式,你可以这样做,虽然代码有点长:

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

This should do it 这应该做到这一点

import re

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

If you have the whole text in the variable str_var 如果你在变量str_var有整个文本

Output: 输出:

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

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

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

PowerShell solution: PowerShell解决方案:

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

Output: 输出:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM