我一直试图找到一个单一的正则表达式模式,它将帮助我匹配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))
我的文件有四种情况:我得到这个输出: 主机名 没有 主机名 没有
你可以使用这个正则表达式,
[^@ ]+(?=[#>])
[^@ ]+
通过排除@
或其中的空间来捕获一个或多个字符来找到主机名,并在确定它后面使用正面向前看的#
或>
时停止捕获(?=[#>])
示例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
您可以使用负字符类和前瞻使用此正则表达式:
[^#>@]+(?=[#>]$)
RegEx详细信息:
[^#>@]+
:匹配1 +字符不是#
和>
和@
(?=[#>]$)
:看看断言我们在行尾之前有#
或>
。另一种选择可以是选择性地匹配主机名之前的内容,包括@
,然后捕获捕获组中的主机名:
(?:\S+@)?(\S+)[#>]
这将匹配:
(?:\S+@)?
可选的非捕获组,其匹配非空白字符的1倍以上,后跟@(\S+)
捕获与1+非空白字符匹配的组[#>]
字符类,匹配#或>