0

特別にフォーマットされたドキュメントからファイル名を取り出してリストに入れようとしています。ドキュメントには大量の情報が含まれていますが、私が気になる行は次のような行で、常に行頭に「ファイル名:」があります。

File Name: C:\windows\system32\cmd.exe

私は次のことを試しました:

xmlfile = open('my_file.xml', 'r')
filetext = xmlfile.read()
file_list = []
file_list.append(re.findall(r'\bFile Name:\s+.*\\.*(?=\n)', filetext))

これはfile_list次のようになります。

[['File Name: c:\\windows\\system32\\file1.exe',
  'File Name: c:\\windows\\system32\\file2.exe',
  'File Name: c:\\windows\\system32\\file3.exe']]

私は出力が単純になるように探しています:

(file1.exe, file2.exe, file3.exe)

上記の出力でも使用ntpath.basenameしてみましたが、リストではなく文字列を入力として使用したいようです。

私はPythonとスクリプト全般に非常に慣れていないので、提案をいただければ幸いです。

4

4 に答える 4

0

これを少し変更して、プロセスを少し読みやすく分離しやすくします-明らかに1つのステップで実行できますが、コードは後で管理するのが難しくなると思います

import re
import os

with open('my_file.xml', 'r') as xmlfile:
    filetext = xmlfile.read()   # this way the file handle goes away - you left the file open
file_list = []
my_pattern = re.compile(r'\bFile Name:\s+.*\\.*(?=\n)')
for filename in my_pattern.findall(filetext):
    cleaned_name = filename.split(os.sep)[-1]
    file_list.append(cleaned_name)
于 2016-05-12T15:02:16.733 に答える
0

より宣言的なスタイルでそれを行うことができます。バグが少なく、メモリ効率が高いことが保証されます。

import os.path

pat = re.compile(r'\bFile Name:\s+.*\\.*(?=\n)')
with open('my_file.xml') as f:
    ms = (pat.match(line) for line in f)
    ns = (os.path.basename(m) for m in ms)
# the iterator ns emits names such as 'foo.txt'
for n in ns:
    # do something

正規表現を少し変更すると、つまり必要のないグループ化になりますos.path

于 2016-05-12T15:39:30.440 に答える
0

次の正規表現を使用して、期待される出力を取得できます。

file_list = re.findall(r'\bFile Name:\s+.*\\([^\\]*)(?=\n)', filetext)

([^\\]*)が検出されるまで、最後のパス区切り記号の後のスラッシュを除くすべてをキャプチャします。オンラインの例\nを参照してください。すでにリストを返しているため、戻り値を既存のリストに追加する必要はありません。findall

于 2016-05-12T14:57:07.243 に答える