Шаблон регулярного выражения, соответствующий имени, оканчивающемуся на # или> - PullRequest
0 голосов
/ 25 января 2019

Я пытался найти один шаблон регулярных выражений, который поможет мне сопоставить 4 различных типа случаев, из которых я могу получить имя хоста.

Дело 1: HOSTNAME #
Дело 2: Хозяин>
Случай 3: myid8 @ HOSTNAME>
Случай 4: myid8 @ HOSTNAME #

Для всех вышеперечисленных случаев мне нужно сопоставлять только имя хоста, имя хоста может быть любым;

до сих пор я пытался соответствовать
«#» для случая 1,
«>» для случая 2,
пытается сопоставить первые "@" и ">" для случая 3
и "@" и "#" для случая 4.

Это то, что я пробовал до сих пор:

def testingregex(self):
    if "@" in self.device_name:
        m = re.search(r'@(.*)>|@(.*)#', self.device_name)
        print("Hostname on the Device is: %s" % m.group(1))
    else:
        m = re.search(r'^(.+?)#|^(.+?)>', self.device_name)
        try:
            print("Hostname on the Device is: %s" % m.group(1))
        except:
            print("Hostname on the Device is: %s" % m.group(2))

В моем файле есть все четыре вида дел: Я получаю этот вывод:
HOSTNAME
Ни один
HOSTNAME
Ни один

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вы можете использовать это регулярное выражение, используя класс отрицательных символов и заглядывание:

[^#>@]+(?=[#>]$)

Демонстрация RegEx

Подробности RegEx:

  • [^#>@]+: сопоставить 1+ символов, которые не являются # и > и @
  • (?=[#>]$): с нетерпением ожидаем, что у нас есть # или > до конца строки.
0 голосов
/ 25 января 2019

Другим вариантом может быть выборочное совпадение с тем, что находится перед именем хоста, включая @, а затем захват имени хоста в группе захвата:

(?:\S+@)?(\S+)[#>]

Это будет соответствовать:

  • (?:\S+@)? Необязательная группа без захвата, которая соответствует 1+ раз непробельному символу, за которым следует @
  • (\S+) Группа захвата, соответствующая 1+ непробельным символам
  • [#>] Класс символов, соответствует # или>

Regex demo | Python demo

0 голосов
/ 25 января 2019

Вы можете использовать это регулярное выражение,

[^@ ]+(?=[#>])

[^@ ]+ находит имя хоста, исключая @ или пробел в нем, фиксирующий один или несколько символов, и прекращает захват, когда он проверяет, следует ли за ним # или > с использованием положительного просмотра вперед (?=[#>])

Демо

Примеры кодов Python,

import re

arr = ['HOSTNAME#','HOSTNAME>','myid8@HOSTNAME>', 'myid8@HOSTNAME#']

for s in arr:
 m = re.search(r'[^@ ]+(?=[#>])', s)
 if (m):
  print(s, ' --> ', m.group())

печать

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