Podmiana regexpa.

Podmiana regexpa.
J1
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:7
0

Witam.
Mam pliczek .cpp i potrzebuje w nim znaleźć konkretnego regexpa i od razu dowiedzieć się ile ile znaków było od początku linii do tego regexpa. Przedstawię przykład, będzie łatwiej zrozumieć:

W pliku .cpp mam coś takiego:

Kopiuj
if( m_Variable->functionCall() == CONST_VARIABLE )

Chce to zamienić na:

Kopiuj
if( m_Variable->functionCall() == CONST_VARIABLE ) ||
  ( m_Variable->function_Call() == OTHER_CONST_VARIABLE)

Napisałem skrypt który znajduje mi: ( m_Variable->functionCall() == CONST_VARIABLE ) wtedy podmienia to na:

Kopiuj
if( m_Variable->functionCall() == CONST_VARIABLE ) ||
( m_Variable->function_Call() == OTHER_CONST_VARIABLE)

Ale niestety nie ma odpowiedniego wcięcia w drugiej linii. Czasem są takie sytuacje, że warunek jest bardziej skomplikowany i wcięcie jest większe. Jak sprawdzić jakia jest odległość znalezionego regexpa od początku linii?

Dzięki,
Pozdrawiam

edytowany 2x, ostatnio: flowCRANE
flowCRANE
Wstawiaj kod w znaczniki kolorujące składnię;
pkozak_pl
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kraków
  • Postów:19
0

Oto funkcja, która zwraca prefix lini z dopasowanym regexem:

Kopiuj
import re


def get_line_prefix(pattern, text):
    matched = re.search(pattern, text)
    if matched:
        prefix_end = matched.start()
        prefix_start = text.rfind('\n', None, prefix_end)
        return text[prefix_start+1:prefix_end]
    raise LookupError()

Poniżej również dołączam testy tej funkcji na wypadek, gdyby coś trzeba było poprawić:

Kopiuj
import unittest


class GetLinePrefixTest(unittest.TestCase):

    def test_not_found(self):
        self.assertRaises(LookupError, get_line_prefix, r'AAA', '')

    def test_empty_prefix_in_first_line(self):
        self.assertEqual('', get_line_prefix(r'AAA', 'AAA  bcde'))

    def test_not_empty_str_in_first_line(self):
        self.assertEqual('example', get_line_prefix(r'AAA', 'exampleAAA  bcde'))

    def test_empty_str_in_next_line(self):
        self.assertEqual('', get_line_prefix(
            r'MMM', 'exampleZZZ  bcde\nMMM'
        ))

    def test_not_empty_str_in_next_line(self):
        self.assertEqual('fooboo ', get_line_prefix(
            r'MMM', 'exampleZZZ  bcde\nfooboo MMM'
        ))


unittest.main()

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.