Autor Zpráva
Anonymouz
Profil
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&nbsp;',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 *
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&nbsp;',view.substr(region))

Chceš nejspíš toto:
print(re.sub('\\b([a-z])\\b\s',  r'\1&nbsp;', 'a a a a a a a a'))
a&nbsp;a&nbsp;a&nbsp;a&nbsp;a&nbsp;a&nbsp;a&nbsp;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
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'&nbsp;',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'&nbsp;',view.substr(region)))
ttttttttt
Profil *
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&nbsp;\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?

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0