Regulárne výrazy – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Regulárne výrazy – Python – Fórum – Programujte.comRegulárne výrazy – Python – Fórum – Programujte.com

 

Martin
~ Anonymní uživatel
1600 příspěvků
17. 2. 2018   #1
-
0
-

Dobrý deň,

chcel by som sa opýtať či sa dá urobiť nejaká alternatíva v jednom reg. výraze. Napríklad  

re.compile(r''' ()(\w+)[\W]?\(P[^\w\)]*([^\)]*) #1
                |  [^P:]\s(\w+)[^\)\w] () ()    #2
                                   
            ''', re.X)

by malo vykonať to, že keď je vo výraze napr "clovek(P: mozog)" tak to vráti [ ("", "clovek", "mozog" )] #1

a ak je vo výraze napr "clovek" tak to vráti [("clovek" , "", "")] #2.

Teda pre string "clovek(P: mozog) clovek" by som dostal [("", "clovek", "mozog"), ("clovek", "","")].

Jendotlivé výrazy samostatne fungujú ale neviem ako ich spojiť. Ďakujem   

Nahlásit jako SPAM
IP: 2001:67c:1220:c1c0:2c8c:6...–
gna
~ Anonymní uživatel
1853 příspěvků
18. 2. 2018   #2
-
0
-

   

>>> s = "clovek(P: mozog) clovek"

>>> re.findall(r'(\w+)(\(P: (\w+)\))?', s)
[('clovek', '(P: mozog)', 'mozog'), ('clovek', '', '')]

>>> re.findall(r'(\w+)\(P: (\w+)\)|(\w+)', s)
[('clovek', 'mozog', ''), ('', '', 'clovek')]
Nahlásit jako SPAM
IP: 213.211.51.–
Martin
~ Anonymní uživatel
1600 příspěvků
18. 2. 2018   #3
-
0
-

#2 gna
Je možné to urobiť vrámci jedného výrazu? 

Nahlásit jako SPAM
IP: 2001:67c:1220:c1c0:1918:e...–
gna
~ Anonymní uživatel
1853 příspěvků
18. 2. 2018   #4
-
0
-

Jak to myslíš? Je to jedním výrazem, jen jsem napsal dvě možnosti.

Nevím, jestli se dá dosáhnout přesně toho výsledku, který jsi chtěl, ale toto mi přijde použitelné.

Nahlásit jako SPAM
IP: 213.211.51.–
Martin
~ Anonymní uživatel
1600 příspěvků
18. 2. 2018   #5
-
0
-

#4 gna
Myslel som aby tam bolo iba jedno findall - je to zadanie v škole. Každopádne už nato skúšam ísť inak.

#2 gna
Je možné to urobiť vrámci jedného výrazu? 

Nahlásit jako SPAM
IP: 2001:67c:1220:c1c0:28a7:b...–
gna
~ Anonymní uživatel
1853 příspěvků
18. 2. 2018   #6
-
0
-

Je to jedním výrazem, jen jsem napsal dvě možnosti.

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
3981 příspěvků
19. 2. 2018   #7
-
0
-

 Opsano zhora:

re.compile(r''' ()(\w+)[\W]?\(P[^\w\)]*([^\)]*) #1
                |  [^P:]\s(\w+)[^\)\w] () ()    #2
                                   
            ''', re.X)

Tak tohle je dost trapne :) Reg. vyraz je string/predpis pro dalsi program. Kazdy znak toho vyrazu ma vyznam. Kazdy!!! I mezera nebo odrazkovani. Cili, napad dobry, ale realizace chybna. Musi to byt v jendom radku za sebou a mozna jeste ozavorkovane. Nevim, do pythonu nedelam. Kdyz vemu to od gna

>>> re.findall(r'(\w+)(\(P: (\w+)\))?', s)
[('clovek', '(P: mozog)', 'mozog'), ('clovek', '', '')]

>>> re.findall(r'(\w+)\(P: (\w+)\)|(\w+)', s)
[('clovek', 'mozog', ''), ('', '', 'clovek')]

>>> re.findall(r'(\w+)(\(P: (\w+)\))?|(\w+)\(P: (\w+)\)|(\w+)', s)
>>> re.findall(r'((\w+)(\(P: (\w+)\))?)|((\w+)\(P: (\w+)\)|(\w+))', s)

Pokud si to chces skladat, pak to musis spojovat jako stringy. V js treba
 

patt  = '(\w+)(\(P: (\w+)\))?'; // 'P: ' ale v js neexistuje
patt += '|(\w+)\(P: (\w+)\)|(\w+)';
reg = new RegExp(patt,'gi');
// a v PY to mozna nepujde, kdyz pred tim musis mit 'r',  r'string'
Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
peter
~ Anonymní uživatel
3981 příspěvků
19. 2. 2018   #8
-
0
-

Jo, a mozna jsem spojil, co jsem spojit nemel. Mozna stacilo spojit jen to tvoje. Nejak mi to ted nemysli.
Kazdopadne, u spojovani bacha. Zalezi na poradi. Kdyz nenajde shodu s moznosti 1, tak zkusi moznost 2. Kdyz ale najde shodu s 1, tak druhou uz nedela. Takze se muzes snadno napalit treba pri hledani
slovo = praotec
vyraz = otec|praotec
Najde otec a tim konci. Spravne mel byt vyraz opacne
vyraz = praotec|otec

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
gna
~ Anonymní uživatel
1853 příspěvků
19. 2. 2018   #9
-
0
-

V Pythonu jde s re.X psát víceřádkové rexegy s komentářema, tak jak to má. Re.findall vrací obsah všech skupin ať jsou kdekoliv. r před stringem znamená raw-string a ruší speciální význam zpětného lomítka. P: jsou tam jako běžné znaky. Přesně to co chce může dostat drobnou úpravou.

r'(\w+)\b(?!\()|(\w+)\(P: (\w+)\)'
Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
3981 příspěvků
20. 2. 2018   #10
-
0
-

#9 gna - Dik za objasneni PY a reg. Njn, mel jsem to radeji zkusit googlovat, nejdriv.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 5 hostů

Podobná vlákna

Regularne vyrazy vs... — založil MCHR

Regulárne výrazy — založil Kent

Vyrazy v jave — založil Tom

Regulární výrazy — založil polonium

Lomenné výrazy — založil Bara

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý