如何自动提取具有.csv扩展名的字符串的一部分。以下示例显示了我尝试从中提取2010_USACE_VA_minmax.csv
的复杂字符串。一个简单的切片在我的情况下不起作用,而是我需要某种模式匹配。
sample = "1001 15707 May 08 23:01 2010_USACE_VA_metadata.xml\r\n-rw-rw-r-- 1 311 1001 1784 May 08 23:01 2010_USACE_VA_minmax.csv\r\ndrwxrwxr-x 2 311 2013"
预期输出
2010_USACE_VA_minmax.csv
答案 0 :(得分:3)
如果您知道这些是空格分隔且名称本身不包含任何空格,并且您尝试查找以.csv
结尾的标记,那么您也可以
>>> tokens = sample.split()
>>> matches = [ i for i in tokens if i.endswith('.csv') ]
>>> matches
['2010_USACE_VA_minmax.csv']
使用正则表达式\S+\.csv(?!\S)
可以实现相同的行为,这不太可读:
>>> import re
>>> re.findall(r'\S+\.csv(?!\S)', sample)
['2010_USACE_VA_minmax.csv']
此处\S+
表示至少有1个连续的非空白字符,\.
是文字.
字符,(?!\S)
表示.csv
不能表示由非空白字符(负零宽度前瞻断言)继承。
但是,看起来您正在解析ls
* nix命令的输出 - 另一种方法是使用glob
模块找到匹配的文件:
>>> from glob import glob
>>> glob('*.csv')
['2010_USACE_VA_minmax.csv']
答案 1 :(得分:2)
此正则表达式提取了csv文件。可能有一个更强大的正则表达式,我并不完美。但这有效:
仅供参考:我用它来测试:Pythex
圆括号非常重要,因为它们是您的捕获组,用于提取您要查找的内容。
(\s\w+\.csv)
如果你想处理文件名中的空格,我相信这应该有效:
(\s[\w,\s-]+\.csv)
以下是Python中正则表达式的信息: https://docs.python.org/3/library/re.html
答案 2 :(得分:1)
如果路径中没有空格:
print(sample[:sample.find(".csv")+4].rsplit(None, 1)[1])
2010_USACE_VA_minmax.csv
输出看起来像是来自unix命令所以可能是使用linux工具来解析它的想法,如果它是unix命令,格式最可能是一致的,所以你可以拆分行来获取文件名:
sample = "1001 15707 May 08 23:01 2010_USACE_VA_metadata.xml\r\n-rw-rw-r-- 1 311 1001 1784 May 08 23:01 2010_USACE_VA_minmax.csv\r\ndrwxrwxr-x 2 311 2013"
for line in sample.splitlines():
f = line.rsplit(None, 1)[1]
print(f)
2010_USACE_VA_metadata.xml
2010_USACE_VA_minmax.csv
2013
我认为2013年来自你已经截断了一些输出。
如果您使用子进程运行该命令而您不需要任何其他数据,ls
可以使用通配符:
from subprocess import check_output
f = check_output(["ls","*.csv"])
或者根据您自己的命令获取权限等:
data = check_output(["ls","-l","*.csv"])
这将只提供.csv文件及其权限,因此您只需要使用分割线再次迭代输出,最后的每个文件都将是一个csv文件。
答案 3 :(得分:0)
import re
mobj = re.search(r'\s\d{4}_[^ ]*csv',sample)
print(mobj.group())
2010_USACE_VA_minmax.csv