使用Python截取文件名的一部分

3

新手报道。

我刚开始接触Python/编程几天,但我想创建一个脚本,可以从文件名中获取符合特定模式的部分,并将其输出到文本文件中。

因此,在我的情况下,假设我有四个像这样的.pdf文件:

aaa_ID_8423.pdf
bbbb_ID_8852.pdf
ccccc_ID_7413.pdf
dddddd_ID_4421.pdf

(Note that they are of variable length.)

我希望这个脚本可以浏览这些文件名,获取“ID_”之后以及文件扩展名之前的字符串。

你能指导我使用哪些Python模块或者可能有所帮助的指导吗?


如果字符串中只有这些数字,你可以使用这个方法,哦,还有这个库是re。 ID = re.findall(r"[0-9]+", *stringname") - undefined
5个回答

8

这里有一个简单的解决方案,使用其他回答中提到的re模块。

# Libraries
import re

# Example filenames. Use glob as described below to grab your pdf filenames
file_list = ['name_ID_123.pdf','name2_ID_456.pdf'] # glob.glob("*.pdf") 

for fname in file_list:
    res = re.findall("ID_(\d+).pdf", fname)
    if not res: continue
    print res[0] # You can append the result to a list

以下应该是您的输出。您应该能够将其适用于其他模式。
# Output
123
456

祝你好运!


6

这里有另一种替代方案,使用re.split(),这可能更接近于您尝试做的事情的本质(虽然使用re.match()re.search()等其他解决方案同样有效、有用且具有教育意义):

>>> import re
>>> re.split("[_.]", "dddddd_ID_4421.pdf")[-2]
'4421'
>>> 

5
如果数字长度不固定,您需要使用正则表达式模块 "re"。
import re

# create and compile a regex pattern
pattern = re.compile(r"_([0-9]+)\.[^\.]+$")

pattern.search("abc_ID_8423.pdf").group(1)
Out[23]: '8423'

正则表达式通常用于匹配变量字符串。我刚刚写的正则表达式是:

查找下划线("_"),后跟可变数量的数字("[0-9]+"),再后面是字符串中最后一个句点("\.[^\.]+$")。


1
请详细阅读位于https://docs.python.org/2/library/re.html的正则表达式库,以更加深入地了解。此外,网络上还有一些正则表达式的速查表,比如https://www.debuggex.com/cheatsheet/regex/python,可以解释KCzar的程序工作原理。 - undefined

2
您可以使用 Python 中的 os 模块,通过 listdir 方法来获取指定路径下的文件名列表,例如:
import os
filenames = os.listdir(path)

现在您可以遍历文件名列表,并使用正则表达式查找所需的模式:
import re
for filename in filenames:
    m = re.search('(?<=ID_)\w+', filename)
    print (m)

上面的代码片段将返回文件名中ID_后面的部分并打印出来。因此,对于您的示例,它将返回4421.pdf、8423.pdf等。您可以编写类似的正则表达式来删除.pdf部分。

嗨,谢谢你的回答。我已经尝试了一个实际文件,并得到了以下的响应:<_sre.SRE_Match object at 0x10d10aac0>看起来它在某个位置找到了ID_,但无法输出字符串。你有什么想法,我是不是做错了什么? - undefined
1
为什么将import语句放在for循环内部? - undefined
因为我在写答案的时候没注意,谢谢你的指正。正在进行编辑。 - undefined

0
你可能想要使用glob,它是一个用于文件匹配的Python模块。根据Python帮助页面上的说明,使用方法如下:
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接