Regulární výraz - zachycení opakující se sekvence

Zdravíčko, v regulárních výrazech jsem nový, ale podle návodu by to šlo, kdybych věděl jak zachytit tři groupy z:

MenuBar[@AutomationId='itemId'][@Name='itemName']

online reg tester mi pomocí regulárního výrazu:

^(\w+)(\[@\w+\='\w+'\])+$

našel fullmatch, ale groupy jenom dvě:

1. MenuBar
2. [@Name='itemName']

přitom se mi to zdá na první pohled správně.

pomůže mi někdo s tín prosím? děkuji


Re:Regulární výraz - zachycení opakující se sekvence
« Odpověď #1 kdy: 02. 10. 2020, 14:44:32 »
Reg tester píše, ale já tomu nerozumím:

A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data

Re:Regulární výraz - zachycení opakující se sekvence
« Odpověď #2 kdy: 02. 10. 2020, 15:21:43 »
Imho pokud captured group matchne neco podruhe, prepise svuj predchozi obsah. Pouzij neco jako
Kód: [Vybrat]
re.findall() v Pythonu. A nebo si to matchni postupne, pokud je pevny pocet opakovani.

Re:Regulární výraz - zachycení opakující se sekvence
« Odpověď #3 kdy: 02. 10. 2020, 17:17:23 »
Záleží na konkrétní implementaci, ale skupiny v regulárním výrazu se obvykle očíslují už v okamžiku parsování regulárního výrazu. Tj. když jedna skupina vyhoví vícekrát, uloží se jen (obvykle) poslední obsah.

Re:Regulární výraz - zachycení opakující se sekvence
« Odpověď #4 kdy: 02. 10. 2020, 19:34:36 »
Děkuji


Re:Regulární výraz - zachycení opakující se sekvence
« Odpověď #5 kdy: 02. 10. 2020, 20:09:34 »
tohle vetsina regex enginu neumi, mozne reseni je prepsat (vyraz)+ na ((?:vyraz)+) a potom rozdelit tu matchnutou skupinu

jvb

Re:Regulární výraz - zachycení opakující se sekvence
« Odpověď #6 kdy: 02. 10. 2020, 20:59:31 »
No, kdyz chces zachytit tri grupy, tak ten regex napis se trema grupama. Nebo mi neco unika?

Kód: [Vybrat]
^(\w+)(\[@\w+\='\w+'\]?)(\[@\w+\='\w+'\]?)+$

Re:Regulární výraz - zachycení opakující se sekvence
« Odpověď #7 kdy: 02. 10. 2020, 21:35:05 »
No, kdyz chces zachytit tri grupy, tak ten regex napis se trema grupama. Nebo mi neco unika?

Kód: [Vybrat]
^(\w+)(\[@\w+\='\w+'\]?)(\[@\w+\='\w+'\]?)+$


ja dotazu rozumim tak, ze grup v hranatych zavorkach muze byt ruzny pocet, podle me nejlepsi pouzit stejny regex dvakrat, jednou v search a podruhe ve findall

Kód: [Vybrat]
import re

s = r"MenuBar[@AutomationId='itemId'][@Name='itemName']"
inner = r"\[@\w+\='\w+'\]"
expr = rf"^(:?(\w+)*)((?:{inner})+)$"
match1 = re.search(expr, s)
match2 = re.findall(inner, match1.group(3))
print(match2) # ["[@AutomationId='itemId']", "[@Name='itemName']"]