12

次のようなファイル名から数字だけを抽出する必要があります。

GapPoints1.shp

GapPoints23.shp

GapPoints109.shp

Python を使用してこれらのファイルから数字だけを抽出するにはどうすればよいですか? forこれをループに組み込む必要があります。

4

4 に答える 4

23

正規表現を使用できます。

regex = re.compile(r'\d+')

次に、一致する文字列を取得します。

regex.findall(filename)

これは、数字を含む文字列のリストを返します。実際に整数が必要な場合は、次を使用できますint

[int(x) for x in regex.findall(filename)]

各ファイル名に数字が 1 つしかない場合は、使用できますregex.search(filename).group(0)(一致することが確実な場合)。一致するものが見つからない場合、上記の行は、 that NoneTypehas not attributeを示す AttributeError を生成しますgroup

于 2012-12-23T03:45:56.103 に答える
5

osしたがって、これらのファイルがどこにあり、どのように取得するかについての説明は何も残していませんが、モジュールを使用してファイル名を取得すると思います。

re名前から数字を取得するには、次のような正規表現を使用するのが最善です。

import re
def get_numbers_from_filename(filename):
    return re.search(r'\d+', filename).group(0)

次に、それを for ループに含めるには、各ファイル名に対してその関数を実行します。

for filename in os.listdir(myfiledirectory):
   print get_numbers_from_filename(filename)

またはそれらの線に沿った何か。

于 2012-12-23T03:45:38.030 に答える
3

数字が 1 つだけの場合:

filter(lambda x: x.isdigit(), filename)
于 2012-12-24T12:53:10.803 に答える
0

ファイルがGoogle Scholarからダウンロードされた後、論文の発行年をファイル名の最初に持ってくるために使用した私のコードを聞いてください。主なファイルは通常次のように構成されます: Author+publishedYear.pdf したがって、このコードを実装すると、ファイル名は PublishedYear+Author.pdf になります。

# Renaming Pdf according to number extraction
# You want to rename a pdf file, so the digits of document published year comes first.
# Use regular expersion
# As long as you implement this file, the other pattern will be accomplished to your filename.

# import libraries
import re
import os

# Change working directory to this folder
address = os.getcwd ()
os.chdir(address)

# defining a class with two function
class file_name:
    # Define a function to extract any digits
    def __init__ (self, filename):
        self.filename = filename

    # Because we have tow pattern, we must define tow function.
    # First function for pattern as : schrodinger1990.pdf
    def number_extrction_pattern_non_digits_first (filename):

        pattern = (r'(\D+)(\d+)(\.pdf)')
        digits_pattern_non_digits_first = re.search(pattern, filename, re.IGNORECASE).group (2) 
        non_digits_pattern_non_digits_first = re.search(pattern, filename, re.IGNORECASE).group (1)
        return digits_pattern_non_digits_first, non_digits_pattern_non_digits_first

    # Second function for pattern as : 1993schrodinger.pdf
    def number_extrction_pattern_digits_first (filename):

        pattern = (r'(\d+)(\D+)(\.pdf)')
        digits_pattern_digits_first = re.search(pattern, filename, re.IGNORECASE).group (1) 
        non_digits_pattern_digits_first = re.search(pattern, filename, re.IGNORECASE).group (2)

        return digits_pattern_digits_first, non_digits_pattern_digits_first



if __name__ == '__main__':

    # Define a pattern to check filename pattern
    pattern_check1 = (r'(\D+)(\d+)(\.pdf)')

    # Declare each file address.
    for filename in os.listdir(address):

        if filename.endswith('.pdf'):
            if re.search(pattern_check1, filename, re.IGNORECASE):

                digits = file_name.number_extrction_pattern_non_digits_first (filename)[0]
                non_digits = file_name.number_extrction_pattern_non_digits_first (filename)[1]
                os.rename(filename, digits + non_digits + '.pdf')

            # Else other pattern exists.    
            else :

                digits = file_name.number_extrction_pattern_digits_first (filename)[0]
                non_digits = file_name.number_extrction_pattern_digits_first (filename)[1]
                os.rename(filename, digits + non_digits + '.pdf')
于 2020-04-30T18:12:27.113 に答える