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

问题描述 投票:0回答:3

我一直试图找到一个单一的正则表达式模式,它将帮助我匹配4种不同类型的情况,从我可以检索主机名。

案例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))

我的文件有四种情况:我得到这个输出: 主机名 没有 主机名 没有

regex python-3.x
3个回答
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
投票

您可以使用负字符类和前瞻使用此正则表达式:

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

RegEx Demo

RegEx详细信息:

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

1
投票

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

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

这将匹配:

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

Regex demo | Python demo

© www.soinside.com 2019 - 2024. All rights reserved.