如何使用Python从子字符串中查找完整字符串?

时间:2015-09-26 17:04:58

标签: python string

如何自动提取具有.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

4 个答案:

答案 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