Замена Vim списка слов с другим тем же списком длины слов?

Пытаясь немного улучшить ответ @ john-la-rooy, я создал небольшой класс, позволяющий простую насмешку для юнит-тестов

Должен работать с python 2 и 3

try:
    import urllib.request as urllib
except ImportError:
    import urllib2 as urllib

from io import BytesIO


class MockHTTPHandler(urllib.HTTPHandler):

    def mock_response(self, req):
        url = req.get_full_url()

        print("incomming request:", url)

        if url.endswith('.json'):
            resdata = b'[{"hello": "world"}]'
            headers = {'Content-Type': 'application/json'}

            resp = urllib.addinfourl(BytesIO(resdata), header, url, 200)
            resp.msg = "OK"

            return resp
        raise RuntimeError('Unhandled URL', url)
    http_open = mock_response


    @classmethod
    def install(cls):
        previous = urllib._opener
        urllib.install_opener(urllib.build_opener(cls))
        return previous

    @classmethod
    def remove(cls, previous=None):
        urllib.install_opener(previous)

Используется так:

class TestOther(unittest.TestCase):

    def setUp(self):
        previous = MockHTTPHandler.install()
        self.addCleanup(MockHTTPHandler.remove, previous)
6
задан Trevor Boyd Smith 10 June 2009 в 22:04
поделиться

2 ответа

Вы можете использовать словарь элементов, сопоставленных с их заменами, а затем использовать его в правой части поиска / замены.

:let r={'a':'A', 'b':'B', 'c':'C', 'd':'D', 'e':'E'}
:%s/\v(a|b|c|d|e)/\=r[submatch(1)]/g

См. : h sub-replace - \ = и : h submatch () . Если вы хотите втиснуть это в одну строку, вы можете использовать буквальный словарь.

:%s/\v(a|b|c|d|e)/\={'a':'A','b':'B','c':'C','d':'D','e':'E'}[submatch(1)]/g

Конкретный пример, который вы привели с заглавными буквами, проще было бы сделать как

:%s/[a-e]/\U\0/g
9
ответ дан 9 December 2019 в 20:48
поделиться

:% s / (a ​​\ | b \ | c \ | d \ | e \ | f) / \ U \ 0 / g

3
ответ дан 9 December 2019 в 20:48
поделиться
Другие вопросы по тегам:

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