Python - 正则表达式从HDFS获取目录名称
问题描述:
我试图从子处理命令的结果中提取文件夹名称。结果 找到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
如何才能做到这一点使用正则表达式?
答
这应该做的伎俩:
(?!/)(lib_\d*)
此正则表达式正在寻找的东西,用lib_
后跟一串数字开始,应该是不够的,如果没有类似文件夹的结果中发现。
(?!/)
是只是为了确保该文件夹是由/
答
在
这里无需正则表达式之前,你不妨使用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
答
干净的方法是使用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']
你至少应该提供的文件夹的预期结构。名称总是一样,如果不是,哪些部分会发生变化以及如何变化。 Ej:文件夹总是以lib_ + isodate开头。 – EndermanAPM
是命名约定总是'lib_timestamp' – Beginner