Есть ли причина, по которой некоторые команды движения VIM ограничены одной строкой?

Я начинаю изучать VIM (я скачал плагин эмулятора для своей IDE), и неудивительно, что это меня раздражает и очень медленно. Это все нормально, и я понимаю, что через этот этап проходят все.

Однако эта особенность довольно неприятна - невозможность перейти на следующую строку с помощью l , предыдущая с h ] или выполните поиск более чем в одной строке с помощью f . # s - это строка, а 1: m = p.match (s), если m - None: break ...

Мне нужно найти, обработать и удалить (одну за другой) любые подстроки, которые соответствуют довольно длинному регулярному выражению:

# p is a compiled regex
# s is a string  
while 1:
    m = p.match(s)
    if m is None:
        break
    process(m.group(0)) #do something with the matched pattern
    s = re.sub(m.group(0), '', s) #remove it from string s

Приведенный выше код не подходит по 2 причинам:

  1. Он не работает, если m.group (0) содержит какие-либо специальные символы регулярных выражений (например, *, + и т. Д.).

  2. Это такое ощущение, что я дублирую работу: сначала я ищу в строке регулярное выражение, а потом мне приходится искать его снова, чтобы удалить.

Как это лучше сделать?

17
задан max 22 August 2010 в 21:47
поделиться

1 ответ

Функция re.sub может принимать функцию в качестве аргумента, поэтому при желании вы можете комбинировать этапы замены и обработки:

# p is a compiled regex
# s is a string  
def process_match(m):
    # Process the match here.
    return ''

s = p.sub(process_match, s)
20
ответ дан 30 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: