2015-05-19 57 views
0

這裏是新手。用Python獲取文件名的一部分

我剛剛在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

如果這些是字符串中唯一的號碼,你可以用這個,噢,庫重新 ID = re.findall(R「[0-9] +」,*字符串名稱「) – LampPost

回答

1

下面是使用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 

Goodluck!

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

爲了詳細說明請查看https://docs.python.org/2/library/re中的正則表達式庫。html 還有一些正則表達式在網上浮動,包括https://www.debuggex.com/cheatsheet/regex/python,它解釋了KCzar的程序如何工作 –

2

可以使用os模塊在Python和做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部分。

+0

嗨,謝謝你的回答。我試圖用一個實際的文件,並得到這個迴應: '<_sre.SRE_Match object at 0x10d10aac0>' 它似乎是在一個位置找到ID_,但不能得到它輸出的字符串。任何想法我做錯了什麼? – Winterflags

+1

爲什麼把輸入放在for循環中? – KCzar

+0

因爲我在寫答案時沒有注意;)。感謝您的更正。編輯它。 – suripoori

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'] 
1

這裏的另一種選擇,使用re.split(),這可能是更接近的精神,正是你正在試圖做的(雖然re.match()re.search()解決方案,等等,也同樣有效,有用的,有益的):

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