我一直在尝试找到一个正则表达式模式,该模式将帮助我从可以检索主机名的四种情况下进行匹配。
案例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))
我的文件有以下四种情况:
我得到以下输出:
主机名
无
主机名
没有
答案 0 :(得分:1)
您可以使用此正则表达式,
[^@ ]+(?=[#>])
[^@ ]+
通过排除@
或其中的空格来捕获一个或多个字符来查找主机名,并在确保其后跟#
或>
后停止捕获积极向前看(?=[#>])
示例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详细信息:
[^#>@]+
:匹配不是#
和>
和@
的1个以上的字符(?=[#>]$)
:先行断言我们在行尾之前有#
或>
。答案 2 :(得分:1)
另一种选择是可选地匹配包含@
的主机名之前的内容,然后在捕获组中捕获主机名:
(?:\S+@)?(\S+)[#>]
这将匹配:
(?:\S+@)?
可选的非捕获组,与非空格字符相匹配1倍以上,后跟@ (\S+)
与1个以上非空格字符匹配的捕获组[#>]
字符类,匹配#或>