2017-05-08 151 views
0

我试图从子处理命令的结果中提取文件夹名称。结果 找到1项Python - 正则表达式从HDFS获取目录名称

drwxr-xr-x - user user   0 2017-05-04 17:19 /user/oozie/share/lib/lib_20170406204755 

我想提取lib_20170406204755。我能够使用

process = subprocess.check_output(['hdfs','dfs','-ls','/user/oozie/share/lib']) 
print process.split(' ')[-1].rstrip().split('/')[-1] 

的文件夹,这样做总是lib_timestamp

如何才能做到这一点使用正则表达式?

+0

你至少应该提供的文件夹的预期结构。名称总是一样,如果不是,哪些部分会发生变化以及如何变化。 Ej:文件夹总是以lib_ + isodate开头。 – EndermanAPM

+0

是命名约定总是'lib_timestamp' – Beginner

回答

0

这应该做的伎俩:

(?!/)(lib_\d*)

此正则表达式正在寻找的东西,用lib_后跟一串数字开始,应该是不够的,如果没有类似文件夹的结果中发现。

(?!/)是只是为了确保该文件夹是由/

Example

1

这里无需正则表达式之前,你不妨使用split()

string = "drwxr-xr-x - user user   0 2017-05-04 17:19 /user/oozie/share/lib/lib_20170406204755" 

folder = string.split('/')[-1] 
print(folder) 
# lib_20170406204755 

但是,如果你坚持:

[^/]+$ 


Python

import re 

string = "drwxr-xr-x - user user   0 2017-05-04 17:19 /user/oozie/share/lib/lib_20170406204755" 

rx = re.compile(r'[^/]+$') 
folder = rx.search(string).group(0) 
print(folder) 
# lib_20170406204755 

a demo on regex101.com

0

干净的方法是使用os.path模块来分开路径。

import os 
import subprocess 

output = subprocess.check_output(['hdfs','dfs','-ls','/user/oozie/share/lib']) 

# there are 8 columns in the output, i.e. we need a maximum of 7 splits per line 
output_table = [line.split(maxsplit=7) for line in output.splitlines()] 

# we are interested in the basename of that path 
filenames = [os.path.basename(row[7]) for row in output_table] 

这个测试输入:

 
drwxr-xr-x - user user   0 2017-05-04 17:19 /user/oozie/share/lib/lib_20170406204755 
drwxr-xr-x - user user   0 2017-05-04 17:19 /user/oozie/share/lib/lib_20110523212454 

文件名会['lib_20170406204755', 'lib_20110523212454']