From 3891c9c0bf5e77c72152bdbc90166897396caea5 Mon Sep 17 00:00:00 2001 From: Kyattsukuro Date: Sat, 14 Mar 2026 15:55:21 +0100 Subject: [PATCH] countings should work --- .../countings_formater.cpython-312.pyc | Bin 1082 -> 1210 bytes .../__pycache__/mappings.cpython-312.pyc | Bin 3574 -> 3574 bytes instructions/countings_formater.py | 18 +++-- .../__pycache__/serializer.cpython-312.pyc | Bin 9002 -> 9367 bytes .../commands/__pycache__/copy.cpython-312.pyc | Bin 897 -> 989 bytes .../find_and_replace.cpython-312.pyc | Bin 1110 -> 1121 bytes .../regex_edit_col.cpython-312.pyc | Bin 908 -> 962 bytes ...ex_group_valuebased_choose.cpython-312.pyc | Bin 0 -> 1449 bytes .../regex_move_to_col.cpython-312.pyc | Bin 4617 -> 5030 bytes table_handler/commands/copy.py | 4 +- table_handler/commands/find_and_replace.py | 4 +- table_handler/commands/regex_edit_col.py | 8 +-- .../commands/regex_group_valuebased_choose.py | 21 ++++++ table_handler/commands/regex_move_to_col.py | 64 +++++++++++------- .../__pycache__/regex_cell.cpython-312.pyc | Bin 1110 -> 1082 bytes table_handler/conditions/regex_cell.py | 2 +- table_handler/serializer.py | 22 +++--- 17 files changed, 95 insertions(+), 48 deletions(-) create mode 100644 table_handler/commands/__pycache__/regex_group_valuebased_choose.cpython-312.pyc create mode 100644 table_handler/commands/regex_group_valuebased_choose.py diff --git a/instructions/__pycache__/countings_formater.cpython-312.pyc b/instructions/__pycache__/countings_formater.cpython-312.pyc index 62b3816a54df4dcfa7f6e0509c6b87f0ad3c9eed..b4edbc11930238bfb74dedb6b138c6a0723f7ae1 100644 GIT binary patch delta 389 zcmdnRv5QmvG%qg~0}$90ZOxp^%E0g##DM{JDC6_0iRy-IQ7ow}S=LH?lu@nMcWp{`Dj!LBax&K~~$!Bui`3R)V`2D+B9+L{Vl z`6;PI$b6L$P39s2pc{)sfW$5KjLh_m)Z!9N7EQ(?kkf$_$Zsndi`YPlq(O=Voc;Y= zJVQMF{TzMbohOSiDRFYZY?y4#G>KQnH6p;(IRxkg|Im=hdzd6Ae`cD%r32K<2*kxZ zCigNc3SMB4xxpZFok95`gYp8OD-4E{_b}_J3bB3QVGuF8A!u|%So|Y9ixAsKMNtu^ h3k(7uj2J}J9!Oc<5L2A|pIL@cak31H6pI$nKmeP^Uzq>^ delta 237 zcmdnRxr;;nG%qg~0}w>&ZppmE!octt#DM`eDC6^-iRy+-S)3E&WSF8@C)Ow!%wdk= zND)jCN)b*GnZuMKnj)4WK8FP;A^{hX1c{_GMR8V2X-ZGLwvEwnaxY_{h$gcpV-Y*h zU?2su8A$O?&So-UX3|fYyn<;GJ6lm|Zhl$nWJ_lG$qCF8xHN%^7=gHW>EvI`ihS4Q zy)VjppYXXXA9;a6X0i^8o~SU}M{xlWrV9)LA2b+5)E-D#-Vl?XT+brIC_Q-&ixi7G GP&WYki8zM< diff --git a/instructions/__pycache__/mappings.cpython-312.pyc b/instructions/__pycache__/mappings.cpython-312.pyc index 01a9437682b37eac5eb8d6afe3e987183636b2d1..8bfee93507cc357c698117fc8c157dca8bab3fe6 100644 GIT binary patch delta 20 acmew+{Y{$tG%qg~0}$Ma-MW$cH7@{1QwF~P delta 20 acmew+{Y{$tG%qg~0}y=S*|L%QH7@{05C(++ diff --git a/instructions/countings_formater.py b/instructions/countings_formater.py index 678790a..fefcc2c 100644 --- a/instructions/countings_formater.py +++ b/instructions/countings_formater.py @@ -13,7 +13,8 @@ EXPECTED_INPUT_TABLE_SCHEMA = [ "Bemerkung" ] -EXPECTED_OUTPUT_TABLE_SCHEMA = deepcopy(EXPECTED_INPUT_TABLE_SCHEMA).remove("Geschlecht") +EXPECTED_OUTPUT_TABLE_SCHEMA = deepcopy(EXPECTED_INPUT_TABLE_SCHEMA) +EXPECTED_OUTPUT_TABLE_SCHEMA.remove("Geschlecht") COL_INSTRUCTIONS = { ("Art",): { @@ -22,15 +23,20 @@ COL_INSTRUCTIONS = { }, ("Ort",): { "command": "REGEX_MOVE_TO_COL", - "with_input_iteration": CATCHED_BY, # Moves matching group {{% 1 %}} to "to" - "match": r"^(?:[^ ]* +)*({{% 1 %}}),?(?: .*+)*$", + "with_input_iteration": CATCHED_BY, # Moves matching group {{% 0 %}} to "to" + "match": r"^(?:[^ ]* +)*({{% 0 %}}),?(?: .*+)*$", "to": "Fangart" }, - ("Fangart",): { + ("Anzahl",): { "command": "REGEX_EDIT_COL", "match": r"^ *$", "replace_with": "1" }, + ("Anzahl",): { + "command": "REGEX_GROUP_VALUEBASED_CHOOS", + "match": r"^ *([0-9]+) *oder *([0-9]+) *$", + "highest": True + }, } ROW_INSTRUCTION = [ @@ -38,7 +44,7 @@ ROW_INSTRUCTION = [ "command": "CONDITIONAL_COPY", "when_regex": { "Geschlecht": r"^(?:[^ ]* +)*(m),?(?: .*+)*$", - "Anzahl": r"/d" + "Anzahl": r"([0-9]+)" }, "source": "Anzahl", "target": "Davon m" @@ -47,7 +53,7 @@ ROW_INSTRUCTION = [ "command": "CONDITIONAL_COPY", "when_regex": { "Geschlecht": r"^(?:[^ ]* +)*(w),?(?: .*+)*$", - "Anzahl": r"/d" + "Anzahl": r"([0-9]+)" }, "source": "Anzahl", "target": "Davon w" diff --git a/table_handler/__pycache__/serializer.cpython-312.pyc b/table_handler/__pycache__/serializer.cpython-312.pyc index 0a3b3285682c58c024ad34e2eec6283e0e626d98..c693891db92020578aa450501c33393f9d28435b 100644 GIT binary patch delta 1918 zcma)7Z){Ul6o0pUee3_V>%XmC%UEUQG1$64lo2Kq*w_p>%*GHfQcB;;y0W(8zE&7k z1jU%ZqTu-eCL{z+h;f?08Y6y^#4LJmbN`aub3G=5OxJ+D-!CdQZach5cN zcTUee_uPBm*?i`4>n9eAkz?Pr-1}qqYfoEi$;|0cZlk1=OyiD}bGMUlGOywKImvvS zlPuF3By-$!dEj=tRGXFAsw=kL?nz#>oxYLxd57dt`A|R2`C88onu24F}C5icATo+Ezv zMF^ALLa6EpAz#5oeKYwOZs4o16t-4vBn_7Ud@jyh>QmpV_z!WxA z*b!SJD zJTp$4VXbMOfGeOY;DTwHfWedmd}_MoYFqt*_p-Oxw&`5(taLv4M)F+ioD*iuA(DiW zIY{=v19Lm^7uqa)H9c#YAIozqMiyA)Tq<2oI)VlhUC9QD=}|302%!~W9YPR_)jkr2 z@2j_v0Cd?}Ne?7!L9ORx5?-~{oSK4BAHcw zdlnB{g>8A5qxC;>tgckzT^poa&9KYrgM!OW9B|p`fG=HLhNisk*duu^S=KCfM>O_9 zklmZD>4{u6iv1YNj%CvDp?gVF{ZLFZUzt;7T zqtN9I`~&?1RMxBn~tE^f)GT&9Mxkf z8p|i+Br2xhVxXU;d^g}1US`(il#0+bHH#(ofLLgiN!O53@ys4*?MH>ZIyRpk7VJ z2Am_*!FvrS*7$V3x8wIXHeA`R4s-n6aB*m4Zs&EYIxos&#bm0Op~WPfmzAH8daoPO zOLv&ms2EE0z~@V6#in>Bm5QY$rG?@{6&=NwDynY2`cy^Z>RUz4aH`SQjt8y0JPh%V qJWKlSR7T2;%j@X{X2q6K24JDFLA$^W!tafNYW6rqe&i6<)%^j9@T`ph delta 1619 zcmZuxZ%kWN6o0qx_4WU2p`|S?g+gIi5X%2aHa9;w*n*P4rkNuK9_`C4e_D25yA4)` zL`~*o$=FF;H2zu4f<_h-#SeZ_W8xgfXzCXepV1IMXrf<;elx~+&I1$^Z}NWko^yWZ zymQYz_uf45_JHz*$Kw=m=$-Fp*FvjGn60fg7yC5HA`A){*Rw*#y>20bAgu39!WqA5 z^Po-Hvz-adOG)qQ52cNZY=}7(q;diud}%o**O=l)Sd5FT0s7^Z>NsiY2^tV|2_cSy z$DkxPvue04Ut%>7w{@`K#)$1QW1m9V-pcO4pY|T9Bu@pPQ}J8-%+)87AA0KiaLZw3 z0oapP90AyJ*jVHrW`t}Ql|191y?*h}TIBF`b{` zE%2&qQjU=_308NLOmXxlpu@c-M`~Yhd8q}OJk4wt9`z)c3g3C z1|}559i1SQEEx%I1-cV2qupxSd(dv%XP2u{K%NbJ!6>ssWmR`VMYh9aA3(P2f7nj= zsH!*SGC5rZ&pw8GH=c*$xs<*9?sy?mRqNgp7v+)+%Sr&Y?JigfDxe0jA%p#5V@ZIC zU;x)4aE0PF-!SjN=+G7#P_ReTLKcgd&CL}HupFv`d!aVDi1wrd{s{F!Z@7Y`U@&|f z>vlbSNEt_yp28A6Eo>=1_%?h4UaX!2XC#Tm?1}t@v}p7wE5TT_Bie#wLq4z06g54` z%tO$rx^&CdqA9ij-$c>xM$LO2L^XSXkK&3BloUe*0|4EqXR ziS@-S3rO303?3Gq{7?`U#jLO>m4qo9s9rxe@z75Vgk_p1_Oa0Y@VQciQ^tOQ02dB(wQ`$UP9(`={^yi8xm$htpYPOu` z^(l;*j7u477_wMEYEVH9 zNSqB-48)TJ;w%nKaga&D44O=Sw-_{8i`an*ZgCaomlh?b#wX|J6tMyYia^%fVl7L| zDNWU6F5=(?ahZ$q%ZvDctjX3)<~B}1MgzkKCT0Py83a6RA===bjQo*_IVYNq_;-%Os20+U^th}C6ahyfZ?%UsJ+!vf?h1KF%KtRTZD^D;@)*Dz&qVj2Kcz`Po2do5Fs zDhor8J_|z)Q!qmj2T-*pYY{V$y2V90-1Y@ zH8roKsPYzbQ7TZbxF9t-6Ug96%qdAN%1bQCoP3f=kQJm~Ve&mD2a#|ftAXJTpV)-b z>D3dfFY_sPFi%!tR#UtoEjQnKruBmA4epnvZ6-Q@WMxp$`M}JeX7+)DK|r{JYjOdz zEu;A4b%>XXkhD{!%~3a?=P!T_Wu|74c4l?9qy!~-Hg0e*|aCO1E&G$+-rNFK-q dg=w)6kodsN$jEq?LGn8b7o+ee1|R{}0|0=uTD<@O delta 369 zcmaFJagBrbG%qg~0}ycQZOQD~$h(12qJ|+0B!C98m?!^dly!7wV2EL2V5nuPWv*d% zVTiQ^vRP_aY8bOv&@=$KWemlPJwheyFd2}l$)_2mCI>Q!2D8*Ktp=I|0?AB_U>wZA z!qDT&!cfUj!~qo6WG!L?Qny$$OHy--Z?Tpo=9H!uF@uEIi&6`65|dMbN;ttvQu9iR zDktw^Qe|NU@+UuGa$xfVG8z~rTQIAs-H}#a;JVy(jAE1bGRrY)PQJsez{A4o&$xp53j>Ir%*G;TF9S5PhzCS~ u!t54@O>TZlX-=wLksOfA2*kxAK;i>4BO~Ko2FdR%9E|>qpBO+SSQh~NRZSxR diff --git a/table_handler/commands/__pycache__/regex_edit_col.cpython-312.pyc b/table_handler/commands/__pycache__/regex_edit_col.cpython-312.pyc index 9230af2d2bdca8e1237824b65b2fc69d215c35e0..087452f5d48d914ea090d2eb1c3e86ae454503a5 100644 GIT binary patch delta 383 zcmeBSKg7;^nwOW00SFXgwr1LG&W4PzFNMh6W%*u{exN>`QDe#{bTl0ZHq5EqL8i4V+- VjEuJ#IKQ)SFgh`QVgQj~-2l?bOZ)%; delta 282 zcmX@a-ows&nwOW00SM0XZOJs;$UB!&nH|Vu2I9{}Kw>&W4PygS4P!7v2_ujT23bs# z6`6#Y8M0VF^kfbuQPmPom}Cv(YN*21AVYv4n4yRbNNKW8PGk}mzQtTzQl!aL1k!Me zwJb5GG<9+llY^lykl(;?gIl1(_J*)ThtC~;!Tz$&vI!~EvnFOOP`R#Td{N1GOYjcS z%~6;69WHPM``aRu`i24+@A#v&e|SP=`509wNjV;6~oSYRoT fe{XTv!&*M5!anvXJF;|@#U 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 str: + res = deepcopy(entry.value) for species, alternatives in self.map.items(): for old_version in alternatives: if old_version in entry.value: - return deepcopy(entry.value).replace(old_version, species) \ No newline at end of file + res = res.replace(old_version, species) + return res \ No newline at end of file diff --git a/table_handler/commands/regex_edit_col.py b/table_handler/commands/regex_edit_col.py index 42dfcfe..c2f1976 100644 --- a/table_handler/commands/regex_edit_col.py +++ b/table_handler/commands/regex_edit_col.py @@ -5,7 +5,7 @@ class RegexEditCol: self.match = match self.replace_with = replace_with - def execute_on_cell(self, value) -> str: - if value is None: - return value - return re.sub(self.match, self.replace_with, str(value)) \ No newline at end of file + def execute_on_cell(self, entry) -> str: + if entry.value is None: + return entry.value + return re.sub(self.match, self.replace_with, entry.value) \ No newline at end of file diff --git a/table_handler/commands/regex_group_valuebased_choose.py b/table_handler/commands/regex_group_valuebased_choose.py new file mode 100644 index 0000000..09a7de6 --- /dev/null +++ b/table_handler/commands/regex_group_valuebased_choose.py @@ -0,0 +1,21 @@ +import regex + +class RegexGroupValuebasedChoose: + def __init__(self, match: str, highest: bool): + self.match = match + self.highest = highest + + def execute_on_cell(self, entry): + matches = regex.match(self.match, entry.value) + if not matches: + return None + groups = matches.groups(default=[]) + + values = sorted(map(lambda x: int(x), groups)) + if not len(values): + return None + if self.highest: + return str(values[-1]) + else: + return str(values[0]) + diff --git a/table_handler/commands/regex_move_to_col.py b/table_handler/commands/regex_move_to_col.py index 10a8301..290297b 100644 --- a/table_handler/commands/regex_move_to_col.py +++ b/table_handler/commands/regex_move_to_col.py @@ -1,12 +1,20 @@ import regex +import re class RegexMoveToCol: def __init__(self, match: str, to: str, with_input_iteration: list[str]|None = None): self.match = match self.to = to - if with_input_iteration is not None and type(with_input_iteration) != list: - with_input_iteration = list(map([e] for e in with_input_iteration)) + if with_input_iteration is not None: + with_input_iteration = ( + [[with_input_iteration]] + if isinstance(with_input_iteration, str) + else [ + x if isinstance(x, list) else [x] + for x in (with_input_iteration if isinstance(with_input_iteration, (list, tuple)) else [with_input_iteration]) + ] + ) self.with_input_iteration = with_input_iteration self.__operation_input_depth = self.__find_operation_input_depth() @@ -14,49 +22,55 @@ class RegexMoveToCol: def __find_operation_input_depth(self): if not self.with_input_iteration: return None - return max(len(option) for option in self.__iteration_input_depth()) + return max(len(option) for option in self.with_input_iteration) @staticmethod - def _get_merged_groups(regex_pattern: str, entry: str) -> str: - match = regex.search(regex_pattern, entry.value) + def _get_merged_groups(regex_pattern: str, value: str) -> str: + match = regex.search(regex_pattern, value) if not match: - return "" + return None return "".join(g for g in match.groups() if g is not None) @staticmethod - def _remove_regex_groups(regex_pattern: str, entry: str) -> str: - match = regex.search(regex_pattern, entry.value) - if not match: - return entry.value + def _remove_regex_groups(pattern, value): + regex = re.compile(pattern) - spans = [s for s in match.spans()[1:] if s != (-1, -1)] + def repl(m): + s = m.group(0) + # remove all group spans from the full match + spans = [m.span(i) for i in range(1, len(m.groups()) + 1) if m.span(i) != (-1, -1)] + spans.sort(reverse=True) - result = [] - last = 0 + for start, end in spans: + rel_start = start - m.start() + rel_end = end - m.start() + s = s[:rel_start] + s[rel_end:] - for start, end in sorted(spans): - result.append(entry.value[last:start]) - last = end + return s - result.append(entry.value[last:]) - return "".join(result) + return regex.sub(repl, value) def do_changes(self, source_coll: str, used_regex: str, row: dict[str, str], changes={}): - changes[self.to] = self._get_merged_groups(used_regex, row[source_coll]) - changes[source_coll] = self._remove_regex_groups(used_regex, row[source_coll]) + current_to = changes.get(self.to, row[source_coll].value) + current_source = changes.get(source_coll, row[source_coll].value) + + pending_res_to = self._get_merged_groups(used_regex, current_to) + if pending_res_to is not None: + changes[self.to] = pending_res_to + changes[source_coll] = self._remove_regex_groups(used_regex, current_source) return changes def execute_on_row(self, row: dict[str, str], source_coll: str = None): if not source_coll: raise ValueError("source_col required") if self.with_input_iteration: - changes = None - used_regex = self.match + changes = {} for iteration in self.with_input_iteration: - for operation_id in range(0, self.__operation_input_depth-1): - used_regex.replace(f"{{{{ {operation_id} }}}}", iteration.get(operation_id)) - changes = self.do_changes(source_coll, used_regex, row, changes) + used_regex = self.match + for operation_id in range(0, self.__operation_input_depth): + used_regex = used_regex.replace(f"{{{{% {operation_id} %}}}}", iteration[operation_id]) + changes = self.do_changes(source_coll, used_regex, row, changes) return changes else: return self.do_changes(source_coll, self.match, row) \ No newline at end of file diff --git a/table_handler/conditions/__pycache__/regex_cell.cpython-312.pyc b/table_handler/conditions/__pycache__/regex_cell.cpython-312.pyc index f1c8aa8fadaa3ff6d0b077eee17f857397e9bc17..72af07a0a7f151d75335b8586bdf9c47cd706620 100644 GIT binary patch delta 191 zcmcb{v5SNEG%qg~0}%Xj+M3z1k#{;H7b}p*48)(eOA4R*?;)0~OS=lyJgCvbcb%geONaiOJb8GE_3LFjO*YviRL%a0}67D*~B+i#4+( zHMe;3WTsw5ugQwcQbISRWaq2TR9~QVSxWc1l<`F=