In [2]:
import re

with open("./output_ohne_Kopf_und_Anm.txt",'r',encoding='utf-8') as infile:
    text = infile.readlines()

#0. Leerzeichen am Zeilenanfang und fünffaches Leerzeichen am Zeilenende entfernen
linesLeer = []
for line in text:
    new_line = re.sub(r'(^\s*)|( *$)', r"", line)
    linesLeer.append(new_line)

#1. Seitenzahl und Komplexnummer entfernen
lines = []
for line in linesLeer:
    match_obj = re.search(r'(^[0-9]*\,[0-9]*.*__*.*)', line)
    if match_obj is None:
        lines.append(line)
        
#2. Seitenzahl und Komplexname entfernen
lines1 = []
for line in lines:
    match_obj = re.search(r'^[0-9]* .*__*.*', line)
    if match_obj is None:
        lines1.append(line)
        
#3. Durchgehende Striche (Ende des Komplexes vor Anmerkungen) entfernen
lines2 = []
for line in lines1:
    match_obj = re.search(r'(^__*)', line)
    if match_obj is None:
        lines2.append(line)
        
#4. Leerzeichen zwischen Münznummer und Stern entfernen
lines3 = []
for line in lines2:
    new_line = re.sub(r'(^\*) ([0-9]*)',r"\1\2", line)
    lines3.append(new_line)

#5. BOM (Byte Order Mark) \ufeff am Zeilenanfang entfernen
lines4 = []
for line in lines3:
    new_line = re.sub(r'^\ufeff',r"", line)
    lines4.append(new_line)
    
#6. Kaiserüberschriften etc. in einer Zeile zusammenführen:
lineToStr = '%%'+'%%'.join(lines4)  
combinedEmperor = re.sub(r'(%%[A-zäöü]*\/?[A-zäöü]*? \([A-zäöü]* ?[A-zäöü]*?\)) ?\n%%(\(.*\))', r"\1 \2", lineToStr)
gloriaRomanorum = re.sub(r'(.*)(GLORIA ROMANORVM)\n%%(.*)', r"\1\2 \3", combinedEmperor)
gloriaRomanorumSplit = re.sub(r'(.*)(GLORIA ROMA)(\-)\n%%(.*)', r"\1\2\4", gloriaRomanorum)
gloriaExercitus = re.sub(r'(.*)(GLORIA EXERCITVS)\n%%(.*)', r"\1\2 \3", gloriaRomanorumSplit)
gloriaExercitusSplit = re.sub(r'(.*)(GLORIA EXER)(\-)\n%%(.*)', r"\1\2\4", gloriaExercitus)
ricLiberal = re.sub(r'(.*)(RIC [0-9]*[A-Z])\n%%(.*)', r"\1\2 \3", gloriaExercitusSplit)
victoriaeLaetae = re.sub(r'(.*)(VICTORIAE)\n%%(LAETAE)\n%%(.*)', r"\1\2 \3 \4", ricLiberal)
sarmatiaDevicta = re.sub(r'(.*)(SARMATIA)\n%%(.*)', r"\1\2 \3", victoriaeLaetae)
rIC_mitSlash = re.sub(r'(.*)(RIC [0-9]*\/)\n%%(.*)', r"\1\2 \3", sarmatiaDevicta)
caesarumNostrorum = re.sub(r'(.*)(CAESARVM)\n%%(.*)\n%%(.*)', r"\1\2 \3 \4", rIC_mitSlash)
vsRs = re.sub(r'(.*)(RIC Vs\.\: [0-9]*)\n%%(.*)', r"\1\2 \3", caesarumNostrorum)
woelfin = re.sub(r'(.*)(Wölfin mit)\n%%(.*)', r"\1\2 \3", vsRs)
victoriaProra = re.sub(r'(.*)(Victoria)\n%%(.*)', r"\1\2 \3", woelfin)
ricverschBaende = re.sub(r'(.*)(RIC \([A-Z]*\))\n%%(.*)', r"\1\2 \3", victoriaProra)
fruejahr = re.sub(r'(.*)([0-9]*\/Früh)(\-)\n%%(.*)', r"\1\2\4", ricverschBaende)
victoriaeDD3Zeilen = re.sub(r'(.*)(VICTORIAE DD)\n%%(NN AVG ET CAE)\n%%(\([0-9]\/[0-9]\) Typ)', r"\1\2 \3 \4", fruejahr)
victoriaeDD = re.sub(r'(.*)(VICTORIAE DD)\n%%(.*)', r"\1\2 \3", victoriaeDD3Zeilen)
vict = re.sub(r'(.*)(VICT DD ?NN)\n%%(.*)\n%%(.*)', r"\1\2 \3 \4", victoriaeDD)
wieRIC = re.sub(r'(.*)(wie RIC \([A-z]*\))\n%%(.*)', r"\1\2 \3", vict)
felTemp = re.sub(r'(.*)(FEL TEMP REPARATIO)\n%%(.*)', r"\1\2 \3", wieRIC)
felTempSplit = re.sub(r'(.*)(FEL TEMP REPA)(\-)\n%%(.*)', r"\1\2\4", felTemp)
vot = re.sub(r'(.*)(VOT\/XX\/)\n%%(.*)', r"\1\2 \3", felTempSplit)
spes = re.sub(r'(.*)(SPES)\n%%(.*)', r"\1\2 \3", vot)
ricPraegestaette = re.sub(r'(.*)(RIC \([A-z]*\) ?[0-9]*?\/?)\n%%(.*)', r"\1\2 \3", spes)
securitas = re.sub(r'(.*)(SECVRITAS)\n%%(.*)', r"\1\2 \3", ricPraegestaette)
ricDreifach = re.sub(r'(.*)([A-z]* [0-9]*[A-z]\/)\n%%(.*)', r"\1\2 \3", securitas)
virtus = re.sub(r'(.*)(VIRTVS ROMA)(\-)\n%%(.*)', r"\1\2\4", ricDreifach)
concordia = re.sub(r'(.*)(CONCORDIA)\n%%(.*)', r"\1\2 \3", virtus)
salus = re.sub(r'(.*)(SALVS ?R?E?I?P?V?B?L?I?C?A?E?)\n%%(.*)', r"\1\2 \3", concordia)
salusSplit = re.sub(r'(.*)(SALVS REI)(\-)\n%%(.*)', r"\1\2\4", salus)
victoriaAuggg = re.sub(r'(.*)(VICTORIA)\n%%(.*)', r"\1\2 \3", salusSplit)
victoriaAugg = re.sub(r'(.*)(VICTORIA AVGG ?\(G\))\n%%(.*)', r"\1\2 \3", victoriaAuggg)
ricGroßbuchstaben = re.sub(r'(.*)([A-z]* \([A-Z]*\) [0-9]*[a-z].*)\n%%(.*)', r"\1\2 \3", victoriaAugg)
ricGroßbuchstabenVariante = re.sub(r'(.*)(w?i?e? ?[A-z]* \([A-Z]*\) [0-9]*\/[0-9]*\; \([A-Z]*\))\n%%(.*)', r"\1\2 \3", ricGroßbuchstaben)
ricGroßbuchstabenVariante1 = re.sub(r'(.*)([A-z]* \([A-Z]*\) [0-9]*\;)\n%%(.*)', r"\1\2 \3", ricGroßbuchstabenVariante)
reparatioRepub = re.sub(r'(.*)(REPARATIO)\n%%(.*)', r"\1\2 \3", ricGroßbuchstabenVariante1)
spesRomanorum = re.sub(r'(.*)(SPES ROMANORVM)\n%%(.*)', r"\1\2 \3", reparatioRepub)
spesRomanorumSplit = re.sub(r'(.*)(SPES ROMA)(\-)\n%%(.*)', r"\1\2\4", spesRomanorum)
doc = re.sub(r'(.*)(RIC [0-9]*\;)\n%%(.*)', r"\1\2 \3", spesRomanorumSplit)
rlmt = re.sub(r'(.*)(RLMT)\n%%(.*)', r"\1\2 \3", doc)
beata = re.sub(r'(.*)(BEATA TRAN)(\-)\n%%(.*)', r"\1\2\4", rlmt)
vonBisInEineZeile = re.sub(r'(%%[0-9]*\.\-)\n%%(.*)', r"\1\2", beata)
praegestaetteUeberzweiZeilen = re.sub(r'(Rom\/)\n(.*)', r"\1\2", vonBisInEineZeile)
cleanCombinedEmperor = re.sub(r'%', "", praegestaetteUeberzweiZeilen)

with open("output_Schritt_6_Optimiert.txt", "w", encoding="utf-8") as output:
    output.writelines(cleanCombinedEmperor)

#7. Trennzeichen (Pipe) zwischen Spalteninhalte setzen: Münznummer (mit und ohne Stern)
with open("./output_Schritt_6_Optimiert.txt",'r',encoding='utf-8') as infile:
    schritt7 = infile.readlines()

lines5 = []
for line in schritt7:
    new_line = re.sub(r'(^\*?[0-9]*\.)(\-?\*?[0-9]*\.)?',r"\1\2|", line)
    whiteSpace = re.sub(r'(\|) ', r'\1', new_line)
    lines5.append(whiteSpace)

#8. Trennzeichen (Pipe) zwischen Spalteninhalte setzen: Nominale
lines6 = []
for line in lines5:
    new_line = re.sub(r'(\|)(¼)?( ? ?[A-zäöüß]*)(\/[A-z]*)?([0-9]*)?(\??)',r"\1\2\3\4\5\6|", line)
    whiteSpace = re.sub(r'(\|) ', r'\1', new_line)
    lines6.append(whiteSpace)

#9. Trennzeichen (Pipe) zwischen Spalteninhalte setzen: Datierung
lines7 = []
for line in lines6:
    new_line = re.sub(r'(\|.*\|)(\")?(\?)?(ca\. )?(nach [A-z]*\. [0-9]*\??)?([0-9]*\/Frühjahr [0-9]*)?([0-9]*\/[A-z]*\. [0-9]*)?([0-9]*\.Jh\.\/[0-9]*\.H\.[0-9]*\.Jh\.\??)?([0-9]*\. H\. [0-9]*\.\/[0-9]*\.Jh\.\?)?([0-9]*\. H\. [0-9]*\.\/?[0-9]*?\.? Jh\.)?([0-9]*\.?\??)(\/[0-9]*\.?\??)?([0-9]* v\.\/[0-9]* n\.)?( Jh\.\??)?(\/[0-9]*\??)?',r"\1\2\3\4\5\6\7\8\9\10\11\12\13\14|", line)
    whiteSpace = re.sub(r'(\|) ', r'\1', new_line)
    lines7.append(whiteSpace)

#10. Trennzeichen (Pipe) zwischen Spalteninhalte setzen: Prägestätte
lines8 = []
for line in lines7:
    new_line = re.sub(r'(\|.*\|.*\|)(\")?([A-zäöüß]*)(\.)?(\/[A-zäöüß]*)?(\?)?(\/[A-zäöüß]*)?',r"\1\2\3\4\5\6\7|", line)
    whiteSpace = re.sub(r'(\|) ', r'\1', new_line)
    lines8.append(whiteSpace)

#11. Trennzeichen (Pipe) zwischen Spalteninhalte setzen: Zitierwerke wie RIC
lines9 = []
for line in lines8:
    new_line = re.sub(r'(\|.*\|GLORIA EXERCITVS [0-9] Fz\. Typ)|(\|.*\|wie [A-z]* \([A-Z]*\) [0-9]*\/[0-9]*\ ?; \([A-Z]*\) [0-9]*\-[0-9]*)|(\|.*\|wie [A-z]* \([A-z]*\) [0-9]*\/ ?[0-9]*)|(\|.*\|wie [A-z]* \([A-z]*\) [0-9]*)|(\|.*\|Pax\/Spes Typ\??)|(\|.*\|Salus\/Laetitia Typ\??)|(\|.*\|[A-Z]* \([A-Z]*\) [0-9]*\/\([A-Z]*\) [0-9]*)|(\|.*\|[A-Z]* \([A-z]*\) [0-9]*[a-z]*\/? ?[0-9]*?[a-z]*?\-Typ)|(\|.*\|RIC [0-9]*\; DOC [0-9]*\, [0-9]*)|(\|.*\|[A-z]* \([A-Z]*\) [0-9]*\/?[0-9]*?\; \([A-Z]*\) [0-9]*\-[0-9]*)|(\|.*\|[A-z]* \([A-Z]*\) [0-9]*[a-z]\/?[0-9]*?[a-z]?\/?[0-9]*?[a-z]*?\; \([A-Z]*\) [0-9]*)|(\|.*\|[A-z]* \([A-Z]*\)[0-9]*)|(\|.*\|[A-z]* \([A-z]*\) [0-9]*\/[0-9]*\?)|(\|.*\|VICTORIA AVGG\(?G\)? \([0-9]\) ?\-?T?y?p?)|(\|.*\|SALVS REIPVBLICAE \([0-9]\))|(\|.*\|CONCORDIA AVGGG Roma)|(\|.*\|GLORIA ROMANORVM \([0-9]\-?[0-9]?\))|(\|.*\|[A-z]* [0-9]*[A-z]\/ [0-9]*[A-z]\/[0-9]*[A-z]?)|(\|.*\|GLORIA EXERCITVS [0-9] Fz\.)|(\|.*\|[A-z]* \([A-z]*\) [0-9]*\-[0-9]* Typ)|(\|.*\|RIC \([A-z]*\) [0-9]*\/? ?[0-9]*? Typ)|(\|.*\|[A-z]* \([A-z]*\) [0-9]*ff\.\??)|(\|.*\|VOT\/XX\/ MVLT\/XXX)|(\|.*\|FEL TEMP REPARATIO FH \([0-9]\?\))|(\|.*\|FEL TEMP REPARATIO FH[0-9]? Typ)|(\|.*\|FEL TEMP REPARATIO FH[0-9])|(\|.*\|FEL TEMP REPARATIO [A-z]* [0-9])|(\|.*\|VICTO?R?I?A?E? DD NN AVG ET CAE \([0-9]\/?[0-9]?\) Typ)|(\|.*\|VICTORIAE DD AVGGQ NN)|(\|.*\|RIC \([A-Z]*\) [0-9]*\/\([A-Z]*\) [0-9]*)|(\|.*\|Victoria auf Prora)|(\|.*\|Wölfin mit Zwillingen)|(\|.*\|RIC Vs\.\: [0-9]* Rs\.\: [0-9]*)|(\|.*\|VICTORIAE LAETAE PRINC PERP\??)|(\|.*\|CAESARVM NOSTRORVM VOT XX?)|(\|.*\|RIC [0-9]*[A-Z] \(LIBERAL\))|(\|.*\|[A-z]* [0-9]* var\.\?)|(\|.*\|RIC [0-9]*\-[0-9]* Var\.)|(\|.*\|RIC [0-9]*\-[0-9]*\??)|(\|.*\|RIC [0-9]*\/ [0-9]* Var\.)|(\|.*\|RIC [0-9]*[a-z]*\/[0-9]*[a-z])|(\|.*\|Vota)|(\|.*\|VOTA)|(\|.*\|s\. Anm\.)|(\|.*\|[A-z]* \([A-z]*\) [0-9]*[A-z]\/ ?[0-9]*?[A-z]*?\-?[A-z]*?)|(\|.*\|[A-z]* \([A-z]*\) ?[0-9]*?[A-z]*?\-?[A-z]*?)|(\|.*\|vgl\. [A-z]* \([A-z]*\) [0-9]*f*\.)|(\|.*\|[A-z]* \([A-Z]*\) [0-9]*[a-z]\; ?\(?[A-Z]*?\)?)|(\|.*\|wie [A-z]* [0-9]*\-[0-9]*)|(\|.*\|[A-z]* [0-9]*[A-z]* \-[0-9]*)|(\|.*\|)(C2)?(vgl\. )?([A-z]*\.? [0-9]*)?(S\. [0-9]*\, Nr\. [0-9]*)?( var\. ?\([0-9]*[A-z]\))?( ?\-?Typ)?(\/[0-9]*)?( ?\-?Typ)?(\/[0-9]*)?( ?\-?Typ)?(\([A-z]\))?( \([a-z]\?\))?([A-z]*\.?)?(\?)?( ?\-?Typ)?(\-[0-9]* Typ)?( [0-9]*[A-z]*\.)?([A-z]*\/[A-z]* [A-z]*\??)?',r"\1\2\3\4\5\6\7\8\9\10\11\12\13\14\15\16\17\18\19\20\21\22\23\24\25\26\27\28\29\30\31\32\33\34\35\36\37\38\39\40\41\42\43\44\45\46\47\48\49\50\51\52\53\54\55\56\57\58\59\60\61\62\63\64\65\66\67\68||", line)
    lines9.append(new_line)

#12. Besonderheiten in die richtige Spalte bringen
lines10 = []
for line in lines9:
    #Besonderheiten die alleine stehen und von zwei Pipes begrenzt sind
    new_line = re.sub(r'(\|\| ?B\.)|(B\. ?\|\|)',r"|B.|", line)
    new_line1 = re.sub(r'(\|\| ?Blei)|(Blei ?\|\|)',r"|Blei|", new_line)
    new_line2 = re.sub(r'(\|\| ?frag\.)|(frag\. ?\|\|)',r"|frag.|", new_line1)
    new_line3 = re.sub(r'(\|\| ?gel\.)|(gel\. ?\|\|)',r"|gel.|", new_line2)
    new_line4 = re.sub(r'(\|\| ?gev\.)|(gev\. ?\|\|)',r"|gev.|", new_line3)
    new_line5 = re.sub(r'(\|\| ?Gst\.)|(Gst\. ?\|\|)',r"|Gst.|", new_line4)
    new_line6 = re.sub(r'(\|\| ?Guß)|(Guß ?\|\|)',r"|Guß|", new_line5)
    new_line7 = re.sub(r'(\|\| ?halb\.)|(halb\. ?\|\|)',r"|halb.|", new_line6)
    new_line8 = re.sub(r'(\|\| ?hybr\.)|(hybr\. ?\|\|)',r"|hybr.|", new_line7)
    new_line8a = re.sub(r'(\|\| ?hyb\.)|(hyb\. ?\|\|)',r"|hyb.|", new_line8)
    new_line9 = re.sub(r'(\|\| ?K\.r\.)|(K\.r\. ?\|\|)',r"|K.r.|", new_line8a)
    new_line10 = re.sub(r'(\|\| ?K\.l\.)|(K\.l\. ?\|\|)',r"|K.l.|", new_line9)
    new_line11 = re.sub(r'(\|\| ?Mzm\.)|(Mzm\. ?\|\|)',r"|Mzm.|", new_line10)
    new_line12 = re.sub(r'(\|\| ?P\.)|(P\. ?\|\|)',r"|P.|", new_line11)
    new_line13 = re.sub(r'(\|\| ?plat\.)|(plat\. ?\|\|)',r"|plat.|", new_line12)
    new_line14 = re.sub(r'(\|\| ?Punze)|(Punze ?\|\|)',r"|Punze|", new_line13)
    new_line15 = re.sub(r'(\|\| ?rd\.)|(rd\. ?\|\|)',r"|rd.|", new_line14)
    new_line16 = re.sub(r'(\|\| ?Rs\.)|(Rs\. ?\|\|)',r"|Rs.|", new_line15)
    new_line17 = re.sub(r'(\|\| ?Ser\.)|(Ser\. ?\|\|)',r"|Ser.|", new_line16)
    new_line18 = re.sub(r'(\|\| ?Serr\.)|(Serr\. ?\|\|)',r"|Serr.|", new_line17)
    new_line19 = re.sub(r'(\|\| ?Vs\.)|(Vs\. ?\|\|)',r"|Vs.|", new_line18)
    
    #Besonderheiten die nicht alleine stehen und von anderem Content getrennt werden müssen
    new_line20 = re.sub(r'(\|)(\|)(.*)(B\.)(.*$)',r"\1\4\2\3\5", new_line19)
    new_line21 = re.sub(r'(\|)(\|)(.*)(Blei)(.*$)',r"\1\4\2\3\5", new_line20)
    new_line22 = re.sub(r'(\|)(\|)(.*)(frag\.)(.*$)',r"\1\4\2\3\5", new_line21)
    new_line23 = re.sub(r'(\|)(\|)(.*)(gel\.)(.*$)',r"\1\4\2\3\5", new_line22)
    new_line24 = re.sub(r'(\|)(\|)(.*)(gev\.)(.*$)',r"\1\4\2\3\5", new_line23)
    new_line25 = re.sub(r'(\|)(\|)(.*)(Gst\.)(.*$)',r"\1\4\2\3\5", new_line24)
    new_line26 = re.sub(r'(\|)(\|)(.*)(Guß)(.*$)',r"\1\4\2\3\5", new_line25)
    new_line27 = re.sub(r'(\|)(\|)(.*)(halb\.)(.*$)',r"\1\4\2\3\5", new_line26)
    new_line28 = re.sub(r'(\|)(\|)(.*)(hybr\.)(.*$)',r"\1\4\2\3\5", new_line27)
    new_line29 = re.sub(r'(\|)(\|)(.*)(hyb\.)(.*$)',r"\1\4\2\3\5", new_line28)
    new_line30 = re.sub(r'(\|)(\|)(.*)(K\.r\.)(.*$)',r"\1\4\2\3\5", new_line29)
    new_line31 = re.sub(r'(\|)(\|)(.*)(K\.l\.)(.*$)',r"\1\4\2\3\5", new_line30)
    new_line32 = re.sub(r'(\|)(\|)(.*)(Mzm\.)(.*$)',r"\1\4\2\3\5", new_line31)
    new_line33 = re.sub(r'(\|)(\|)(.*)(P\.)(.*$)',r"\1\4\2\3\5", new_line32)
    new_line34 = re.sub(r'(\|)(\|)(.*)(plat\.)(.*$)',r"\1\4\2\3\5", new_line33)
    new_line35 = re.sub(r'(\|)(\|)(.*)(Punze)(.*$)',r"\1\4\2\3\5", new_line34)
    new_line36 = re.sub(r'(\|)(\|)(.*)(rd\.)(.*$)',r"\1\4\2\3\5", new_line35)
    new_line37 = re.sub(r'(\|)(\|)(.*)(Rs\.)(.*$)',r"\1\4\2\3\5", new_line36)
    new_line38 = re.sub(r'(\|)(\|)(.*)(Ser\.)(.*$)',r"\1\4\2\3\5", new_line37)
    new_line39 = re.sub(r'(\|)(\|)(.*)(Serr\.)(.*$)',r"\1\4\2\3\5", new_line38)
    lines10.append(new_line39)
    
#13. Trennzeichen (Pipe) zwischen Spalteninhalte setzen: Konkordanz
lines11 = []
for line in lines10:
    new_line = re.sub(r'(ST [0-9]*[a-z]*)?(KP )?([0-9]*,)?([0-9]*\-)?([0-9]*\/)?([0-9]*)([0-9a-z])?([a-z]\-[a-z])?( \?)?( )?(\n)',r"|\1\2\3\4\5\6\7\8\9\10\11", line)
    cleanNew_line = re.sub(r'([a-z])\|([a-z] *?\n)', r"\1\2", new_line)
    lines11.append(cleanNew_line)

#14. Trennzeichen (Pipe) zwischen Spalteninhalte setzen: Überschriften mit Pipes versehen
lines12 = []
for line in lines11:
    new_line = re.sub(r'(^\(?[A-z].*)',r"\1||||||", line)
    lines12.append(new_line)

#Finaler Output
with open("muenzdaten.csv", "w", encoding="utf-8") as out:
    out.writelines(lines12)