Python - wyrażenia regularne

0

Witajcie, mam takie problem, korzystam z edytora Sublime Text 2, który jest właśnie napisany w Pythonie i chciałbym sobie szybko sformatować kod, ale nie wiem jak ominąć ciągi znaków.
Żeby Wam to zobrazować pokażę to na kodzie:

$string1 = 'Jakiś string z przykładową kropką, którą nie powinna zostać sformatowana';
$string2 = DATADIR.SITEMAP.EXT; // docelowo: DATADIR . SITEMAP . EXT
$string3 = 'Kolejny string, tym razem ma kilka kropek. I kolejna. A to już ostatnia.';

Teraz chciałbym, aby kropki NIE ZNAJDUJĄCE się w stringach nie zostały sformatowane, a kropki poza stringami zostały zamienione na . (gdzie _ to spacja), w tym przypadku DATADIR.SITEMAP.EXT powinno zostać zamienione na DATADIR . SITEMAP . EXT, a reszta kropek nie ruszona.

Nie znam sposobu na zrobienie tego, chodzi mi tylko o idee w jaki sposób zaznaczyć, że COŚ ma zostać znalezione, ale tylko, gdy nie znajduje się pomiędzy czymś (w moim przypadku ZAWSZE będą to ' i '). Wszystkie moje pomysły na znalezienie tego już testowałem, niestety, chyba nawet nie zbliżyłem się do rozwiązania problemu.

Będę wdzięczny za jakiekolwiek podpowiedzi. Pozdrawiam,
artuross

0

sprawdzanie czy znak po kropce jest "spacją"?

0

No właśnie nie, bo ciąg znaków może mieć wartość ..., poza tym znak po kropce może być spacją, niezależnie od tego, ile spacji będzie przed czy po kropce, chciałbym ją sformatować mimo wszystko, a później i tak użyłbym zamiany dwóch spacji na jedną.
Dodam, że edytor "rozumie", gdzie jest znak otwierający string, a gdzie kończący.

0

Tytuł wątku sugeruje że próbujesz to zrobić za pomocą wyrażeń regularnych - nie jestem pewien czy to się w ogóle da zrobić wyrażeniami regularnymi (wiele stringów w linii, jednym regexem się tego nie podmieni, a nawet wieloma, działanie jest zależne od kontekstu czego regexy nie wyrażą. Chyba że z lookaheadem/lookbehindem - próbowałem coś stworzyć ale niezbyt mi wyszło...).

Jeśli tak, to IMO źle do tego podchodzisz - to idealne zadanie dla języka skryptowego.
3) naklepany na szybko (brzydki i zły!) przykładowy kod w pythonie (obsłużyłem to co mi przyszło do głowy):

def do_it(text):
    out = ""
    i = 0
    instr = 0
    for i in range(len(text)):
        if (text[i] == '"' or text[i] == "'") and (instr == 0 or text[i] == instr) and text[i-1] != '\\':
            out += text[i]
            if instr:
                instr = 0
            else:
                instr = text[i]
        elif text[i] == '.' and not instr:
            out += ' . '
        else:
            out += text[i]
    return out
        

print do_it("""$string1 = 'Jakiś string z przykładową kropką, którą nie powinna zostać sformatowana';
$string2 = DATADIR.SITEMAP.EXT; // docelowo: DATADIR . SITEMAP . EXT
$string3 = 'Kolejny string, tym razem ma kilka kropek. I kolejna. A to już ostatnia.';""");

print do_it(r""" .'.."..\'..'..\".."...'...".. """); # test hardcore - wygląda na to że zdany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1