Autor | Zpráva | ||
---|---|---|---|
Anonymouz Profil |
#1 · Zasláno: 10. 8. 2020, 16:05:14
Snažím se napsat si vlastní plugin do SublimeText3 a s Pythonem dělám poprvé, proto prosím o radu.
Kód zkráceně vypadá následovně import sublime, sublime_plugin, re class NbspCommand(sublime_plugin.TextCommand): def run(self, edit): view = self.view for region in view.sel(): self.view.replace(edit,region,re.sub('\s([a-z]{1})(\s)',' '+r'\1 ',view.substr(region))) self.view.replace(edit,region,re.sub('(?![^<]*>)(?<=\d)\s(?=března)',' '+r'\1 ',view.substr(region))) self.view.replace(edit,region,re.sub('(?![^<]*>)(?<=\d\s)m2',' '+r'\1m²',view.substr(region))) Víceméně předělávám konvertor z PSPadu a snažím se ho přepsat do Pythonu jako plugin. Problém č.1 Když napíšu 'a a a a a a a a', tak mi to nahradí pouze každou druhou mezeru. Problém č.2 u '5 března' mi to nedoplní mezeru ale vyhodí chybovou hlášku '' File "./python3.3/sre_parse.py", line 870, in expand_template sre_constants.error: invalid group reference' Díky za každou pomoc s Pythonem nemám žádnou zkušenost. Pokud je problém, že dotaz příliš nesouvisí s webem ale spíš s programováním, tak to můžete klidně smazat. |
||
ttttttttt Profil * |
#2 · Zasláno: 10. 8. 2020, 17:17:27
Anonymouz:
Odlaď regulární výrazy někde vedle. V první případě jsou možná problém překrývající se patterny a ta mezera mi příjde divná. re.sub('\s([a-z]{1})(\s)',' '+r'\1 ',view.substr(region)) Chceš nejspíš toto: print(re.sub('\\b([a-z])\\b\s', r'\1 ', 'a a a a a a a a')) a a a a a a a a Ve druhém případě (a na tom to celé spadne) odkazuješ na referenci, která neexistuje. Máš tam \1 , ale v regexpu jen všechny skupiny lookahead/lookbehind, které nezachytávají reference (non-capturing), ale snad do nich jde přidat další závorky, které to zachytí. Nejde to jednodušeji bez looků?
Totéž myslím ve třetím případě, ale ten už jsem nezkoušel. |
||
Anonymouz Profil |
#3 · Zasláno: 11. 8. 2020, 11:23:57
ttttttttt:
„Ve druhém případě (a na tom to celé spadne) odkazuješ na referenci, která neexistuje. Máš tam \1 , ale v regexpu jen všechny skupiny lookahead/lookbehind, které nezachytávají reference (non-capturing), ale snad do nich jde přidat další závorky, které to zachytí. Nejde to jednodušeji bez looků?“
Ty chyby jsou způsobeny tím, že python a ani regex neovládám. V Pythonu jsem nepsal vůbec nikdy a v regexu jen drobnosti. Lookhead a Lookbehind jsem začal používat, protože se to v té době nejvíc přibližovalo tomu co jsem potřeboval a jiné řešení mě nenapadlo + PSPad dost věcí ani nepodporuje (např. modifikátory atd.) Na rychlo jsem sepsal, jak by něco takového vypadalo v JS. Živá ukázka Je to pouze pro ilustraci vykopírované z PSPadu a napsané do JS. Spíš než o kontrolu tohoto kódu, mi ale jde o vyřešení toho Python pluginu. Nyní se zdá, že hodně problémů zmizelo, když jsem odmazal tu divnou mezeru. To s čím ještě bojuji je, že se mi nedaří přidat modifikátor /i, aby to bralo v potaz malá i velká písmena. Koukal jsem na nějaké příklady, jak to píšou ostatní, ale vyhazuje mi to chybu "AttributeError: 'str' object has no attribute 'IGNORECASE'" .
Snažím se to přidat např do následujícího. Vím, že to jde zahrnout velké a malé znaky i do toho self.view.replace(edit,region,re.sub('\s([a-z]{1})(\s)', r' ',view.substr(region))) Jde tam nějak zapnout IgnoreCase nebo je jediná možnost velké znaky zahrnout do toho řetězce? self.view.replace(edit,region,re.sub('\s([a-z A-Z]{1})(\s)', r' ',view.substr(region))) |
||
ttttttttt Profil * |
#4 · Zasláno: 11. 8. 2020, 13:05:04
Anonymouz:
Lookhead a Lookbehind jsou poměrně pokročilé, podle nich jsem usoudil, že se v nich vyznáš. A jestli jsi stvořil regexp v té ukázce a funguje, tak asi i trochu jo. :) Bez nich to jde takto (předpokládám, že pointa je nahradit mezeru za nedělitelnou). print(re.sub('(\d.) (března|dubna)', r'\1 \2', '5. dubna')) Místo \s na začátku chceš často spíš \b , což je hranice slova (word boundary), ošetří to případy, kdy tam budou uvozovky, začátek řádku atp.
Ignorecase jsem našel takto: re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE) . Děláš zřejmě něco podobného, ale jinak. Možná 're'.IGNORECASE podle té chyby?
|
||
Časová prodleva: 4 roky
|
0