正则表达式模式以匹配以#或>结尾的名称

时间:2019-01-25 17:38:37

标签: regex python-3.x

我一直在尝试找到一个正则表达式模式,该模式将帮助我从可以检索主机名的四种情况下进行匹配。

案例1:HOSTNAME#
情况2:HOSTNAME>
情况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))

我的文件有以下四种情况: 我得到以下输出:
主机名

主机名
没有

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式,

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

[^@ ]+通过排除@或其中的空格来捕获一个或多个字符来查找主机名,并在确保其后跟#>后停止捕获积极向前看(?=[#>])

Demo

示例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

答案 1 :(得分:1)

您可以使用否定字符类和超前使用此正则表达式:

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

RegEx Demo

RegEx详细信息:

  • [^#>@]+:匹配不是#>@的1个以上的字符
  • (?=[#>]$):先行断言我们在行尾之前有#>

答案 2 :(得分:1)

另一种选择是可选地匹配包含@的主机名之前的内容,然后在捕获组中捕获主机名:

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

这将匹配:

  • (?:\S+@)?可选的非捕获组,与非空格字符相匹配1倍以上,后跟@
  • (\S+)与1个以上非空格字符匹配的捕获组
  • [#>]字符类,匹配#或>

Regex demo | Python demo