2011-06-10 31 views
0

我有一個包含大量文件的目錄。文件名與以下類似:(數字)一(數字),其中(數字)可以是任何數字。還有一些名稱爲:(號碼)的文件,其中(號碼)可以是任何數字。我想知道如何在文件名末尾添加額外的「一個(數字)」文件數。如何在python中執行string.startswith()時忽略數字?

比方說,我有文件名列表,我想這樣做

for n in list: 
    if n.startswith(the(number)one): 
     add one to a counter 

的有反正它在(數)的空間做了startswith時接受任何數目?

例子: the34one5 the37one2 the444one3 the87one8 the34 the32

這應返回4.

回答

8

使用與re模塊匹配的'one \ d +'的正則表達式。

import re 
for n in list: 
    if re.search(r"one\d+", n): 
     add one to a counter 

如果你想讓它非常準確的,你甚至可以這樣做:

for n in list: 
    if re.search(r"^the\d+one\d+$", n): 
     add one to a counter 

甚至會採取之間「的」和「一個」,並榮獲」任何可能的非數字字符的護理在''之前和最後一位數字之後允許任何其他內容。

你應該現在就開始學習正則表達式:

  • 他們讓你做一個眨眼一些複雜的文本分析,這將是很難手工編碼
  • 他們幾乎工作一樣從一種語言到另一種,使得你更靈活
  • 如果遇到使用它們一些代碼,你會疑惑,如果你沒有引起它不是你能猜到
  • 你知道他們越早,越快,你將學習時NOT(hint)使用它們。這最終與瞭解它們同樣重要。
+0

我認爲正則表達式應該是「one \ d + $」,因爲OP指定他想在文件名的末尾匹配__「one(number)」或者一個完整的正則表達式「the \ d + one \ d +」並使用'match()'而不是'search()'。 – mouad 2011-06-10 15:59:07

+0

你是對的,我添加了第二個更精確匹配的例子。 – 2011-06-10 16:06:24

0

到可能做到這一點,最簡單的方法是glob.glob()

number = len(glob.glob("/path/to/files/the*one*")) 

注意*這裏將匹配任何字符串,而不是隻是數字。

+1

這是聰明的,但它會失敗,如果任何字符不是一個數在「the」和「one」之間 – 2011-06-10 15:50:48

+0

glob.glob()會匹配當前工作目錄中的文件。你可能意味着'fnmatch.fnmatch()'。 – 2011-06-10 15:51:05

+0

@Thomas:不,我不是指'fnmatch.fnmatch()',因爲'glob.glob()'在這裏更容易使用。感謝您指出目錄中的問題! – 2011-06-10 15:53:40

0

同爲一個班輪,也回答,因爲它應該匹配「的」以及問題:

import re 
count = len([name for name in list if re.match('the\d+one', name)]) 
相關問題