2016-12-18 4 views
0

Ich bin neu in Python und ich kämpfe mit einem wahrscheinlich einem einfachen Problem für sie alle da draußen, und vielleicht könnten Sie mir bitte helfenPython-String durch Vorlage geteilt

Grundsätzlich würde ich eine Funktion benötigen, die ein kontinuierliches liest String und brechen sie wie folgt: erste 5 Zeichen, fügt Komma nächsten 6 Zeichen, fügt Komma nächsten 6 Zeichen, fügt Komma, fügt neue Zeile und wiederholt dann

Das Problem: meine Zeichenfolge ist:

"CARMD000000000003FEFFE000004000004BCCXT000009000025BBT01000035000025" 

Ich muss teilen diese Zeichenfolge in Komma durch folgende Regel: 5-6-6 \n

Erwartetes Ergebnis:

CARMD,000000,000003, 

FEFFE,000004,000004, 

BCCXT,000009,000025, 

BBT01,000035,000025, 

Vielen Dank für Ihre Hilfe.

Antwort

1
import re 

text = "CARMD000000000003FEFFE000004000004BCCXT000009000025BBT01000035000025" 
match = re.findall(r'([A-Z]{5})(\d{6})(\d{6})', text) 
lines = [','.join(item) for item in match] 
print(*lines, sep='\n') 

aus:

CARMD,000000,000003 
FEFFE,000004,000004 
BCCXT,000009,000025 

Verwendung Regex Text übereinstimmen, wird eine Liste von Tupel zurück:

[('CARMD', '000000', '000003'), ('FEFFE', '000004', '000004'), ('BCCXT', '000009', '000025')] 

als Verständnis Verwendung Liste eine Liste zu erstellen, wobei jedes Element in der Liste ist Zeichenfolge, verkettet durch das Tupel unter Verwendung von ','.

Linien:

['CARMD,000000,000003', 'FEFFE,000004,000004', 'BCCXT,000009,000025'] 
+0

diese Lösung die endgültige Zeichenfolge in eine Variable nicht speichern. Es druckt es nur aus. Ich denke, das ist gut, wenn Sie es nur für den einmaligen Gebrauch wollen. –

+0

@Cheyn Shmuel Ich speichere Daten in der Liste "Linien" –

1

"One-line" Lösung re.findall() und str.join() Funktionen:

s = "CARMD000000000003FEFFE000004000004BCCXT000009000025BBT01000035000025" 
chunks = ',\n'.join(','.join(t) for t in re.findall(r'(\w{5})(\w{6})(\w{6})', s)) 

print(chunks) 

Der Ausgang:

CARMD,000000,000003, 
FEFFE,000004,000004, 
BCCXT,000009,000025, 
BBT01,000035,000025 
0

Ein einfaches Programm wie dieses sollte Mach den Trick:

s = "CARMD000000000003FEFFE000004000004BCCXT000009000025BBT01000035000025" 
new_s = '' 
while s: 
    for x in (5, 6, 6): 
     new_s += s[:x] 
     s = s[x:] 
     new_s += ',' 
    new_s += '\n' 

print(new_s) 

Ausgang:

CARMD,000000,000003, 
FEFFE,000004,000004, 
BCCXT,000009,000025, 
BBT01,000035,000025, 

fand ich eine verschachtelte Schleife effizient.

1

Eine Alternative zu regex mit wie unten mit einer Liste Slicing-for-Schleife verwendet:

>>> s = 'CARMD000000000003FEFFE000004000004BCCXT000009000025BBT01000035000025' 
>>> 
>>> for i in range(len(s)/17): 
...  temp = s[i*17:i*17+17] 
...  print '{}, {}, {},'.format(temp[:5], temp[5:11], temp[11:17]) 
... 
CARMD, 000000, 000003, 
FEFFE, 000004, 000004, 
BCCXT, 000009, 000025, 
BBT01, 000035, 000025, 
Verwandte Themen