Подтвердите часть или полную строку с помощью регулярного выражения - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь найти совпадение строки, когда она начинается с определенной части слова. Это сложно объяснить, поэтому я приведу пример; Я работаю над сценарием, который проверяет, какой тип сетевого интерфейса на устройстве Cisco нужен пользователю. Это может быть Ethernet, FastEthernet, GigabitEthernet или TenGigabitEthernet. Дело в том; Пользователь может указать эти имена с аббревиатурами. Строка «Fa» может использоваться, например, для FastEthernet, а также «Fas», «Fast», «FastE» и т. Д.

Так что мне нужно регулярное выражение, которое дает мне положительное совпадение с FastEthernet, когда пользователь вводит 'Fas' или Fast.

Я попробовал следующее регулярное выражение;

^ (Fa | Fas | Быстрый | FastE | FastEt | FastEth | FastEthe | FastEther | FastEthern | FastEtherne | FastEthernet)

Что работает, но очень уродливо и не очень портативно.

#!/usr/bin/env python3

import re

def get_interface(name):
    """ Return the full name of the interface """

    if re.match('^(Gi|Gig|Giga|Gigab|Gigabi|Gigabit|GigabitE|GigabitEt|GigabitEth|GigabitEthe|GigagibitEther|GigabitEthern|GigabitEtherne|GigabitEthernet)', name):
        return 'GigabitEthernet'
    elif re.match('^(Fa|Fas|Fast|FastE|FastEt|FastEth|FastEthe|FastEther|FastEthern|FastEtherne|FastEthernet)', name):
        return 'FastEthernet'
    elif re.match('^(Et|Eth|Ethe|Ether|Ethern|Etherne|Ethernet)', name):
        return 'Ethernet'


print(get_interface('Gi'))

Нет сообщений об ошибках.

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

На самом деле это не требует регулярных выражений, и без них проще.

Приведенное ниже решение хорошо масштабируется при добавлении новых вариантов Ethernet и проверяет неоднозначные и неизвестные имена.

variants = ["Ethernet", "FastEthernet", "GigabitEthernet", "TenGigabitEthernet"]

def get_interface(name):
    result = None
    for v in variants:
        if v.startswith(name):
            if result:
                raise KeyError("Ambiguous name")
            result = v
    if not result:
        raise KeyError("Unknown name")
    return result
0 голосов
/ 09 июля 2019

Вот, пожалуйста:

import re

name = 'Gig'

def get_interface(name):
    options = ['GigabitEthernet', 'FastEthernet', 'Ethernet']
    for option in options:
        if any(re.match(line, name) for line in [option[0:i+1] for i in range(len(option))]):
            return option

Выход:

GigabitEthernet
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...