新手在这里。
我刚刚使用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模块和指南吗?
答案 0 :(得分:4)
如果数字是可变长度的,那么您将需要正则表达式模块"重新"
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 :(得分: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部分。
答案 2 :(得分:2)
这是使用其他答案中提到的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
古德勒克!
答案 3 :(得分:2)
以下是使用re.split()
的另一种选择,这可能更接近您正在尝试做的精神(尽管解决方案包含re.match()
和{{1}除其他外,它们同样有效,有用和有启发性:
re.search()
答案 4 :(得分:0)
你可能想使用glob,它是文件globbing的python模块。在python帮助页面中,用法如下:
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']