0

在这里,我正在使用 python 正则表达式,这是我的uname命令输出

$ uname -n
usa-ca-app01.example.com

这是我的python脚本

#!/usr/bin/python

import os
from time import strftime
import commands

status, output = commands.getstatusoutput("uname -n")
backupfile = output.split('.')[0] + "-backup-" + strftime("%m-%d-%y")

print backupfile

脚本输出为:

$ ./backup.py
usa-ca-app01-backup-02-12-13

我的问题:我想要这样的输出,app01-backup-02-12-13所以我想知道我们可以在正则表达式函数中使用多个分隔符split来获得所需的输出,还是有什么好方法可以将优雅的正则表达式与 python 一起使用?

4

4 回答 4

2

如果它不必是正则表达式,您可以再次使用 split :

backupfile = output.split('.')[0].split('-')[2] + "-backup-" + strftime("%m-%d-%y")

或者你可能有多个“-”分隔符,并且总是想要最后一个,以防万一你可以使用:

subdomain = output.split('.')[0]
delimiter = "-"
subdomain_split = subdomain.split(delimiter)
split_length = len(subdomain_split)

backupfile = subdomain_split[split_length-1] + "-backup-" + strftime("%m-%d-%y")

或使用正则表达式:

regex = re.compile(".*-([a-zA-Z0-9]*).*",re.IGNORECASE)
r = regex.search(output)
backupfile = r.groups(0)[0] + "-backup-" + strftime("%m-%d-%y")
于 2013-02-12T21:58:58.560 回答
1

假设您有非常一致的主机名,并且您只想要最后一部分...

首先,不要执行 uname 命令,而是使用os.uname(您已经导入),然后像这样进行两个拆分:

hostname = os.uname()[1]
backupfile = hostname.split('.')[0].split('-')[2] + '-backup-' + strftime('%m-%d-%y')

这是一个输出示例:

>>> hostname.split('.')[0].split('-')[2] + '-backup-' + strftime('%m-%d-%y')
'app01-backup-02-12-13'

我建议使用%Y-%m-%d它,它使按文件名排序更有意义。

>>> hostname.split('.')[0].split('-')[2] + '-backup-' + strftime('%Y-%m-%d')
'app01-backup-2013-02-12'

〜汤米

于 2013-02-12T21:44:53.343 回答
1

我认为您不需要正则表达式,只需使用 split 两次:

output.split('.')[0].split('-')[-1]
于 2013-02-12T21:35:34.330 回答
1

splitwith nomaxsplitrsplitwith之间的差异可以忽略不计maxsplit

> python -m timeit "'usa-ca-app01.example.com'.split('.')[0].split('-',)[-1]"
1000000 loops, best of 3: 0.868 usec per loop
> python -m timeit "'usa-ca-app01.example.com'.split('.', 1)[0].rsplit('-', 1)[-1]"
1000000 loops, best of 3: 0.891 usec per loop
于 2013-02-12T21:36:48.867 回答