Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: sobol79 02. 10. 2020, 14:26:17

Název: Regulární výraz - zachycení opakující se sekvence
Přispěvatel: sobol79 02. 10. 2020, 14:26:17
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
Název: Re:Regulární výraz - zachycení opakující se sekvence
Přispěvatel: sobol79 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
Název: Re:Regulární výraz - zachycení opakující se sekvence
Přispěvatel: ⚫⚫⚫ 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.
Název: Re:Regulární výraz - zachycení opakující se sekvence
Přispěvatel: Filip Jirsák 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.
Název: Re:Regulární výraz - zachycení opakující se sekvence
Přispěvatel: sobol79 02. 10. 2020, 19:34:36
Děkuji
Název: Re:Regulární výraz - zachycení opakující se sekvence
Přispěvatel: Google CTCCTCGGCGGGCACGTAG 02. 10. 2020, 20:09:34
tohle vetsina regex enginu neumi, mozne reseni je prepsat (vyraz)+ na ((?:vyraz)+) a potom rozdelit tu matchnutou skupinu
Název: Re:Regulární výraz - zachycení opakující se sekvence
Přispěvatel: jvb 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+'\]?)+$
Název: Re:Regulární výraz - zachycení opakující se sekvence
Přispěvatel: Google CTCCTCGGCGGGCACGTAG 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']"]