2017-09-01 11 views
1

標準のvsftpログファイルからファイル名と拡張子全体を取得したい。Pythonの正規表現全体のファイル名に一致するファイルの拡張子を含める

ファイルは以下の通りです:

Wed Aug 31 10:23:59 2017 1 ::ffff:172.18.1.168 18593420 /Shell_Scripting.sh b _ i r user1 ftp 0 * c 
Wed Aug 31 10:24:18 2017 1 ::ffff:172.18.1.168 18593420 /test.txt b _ i r user1 ftp 0 * c 

が、私は正規表現

pattern = re.compile(r'\/(\w+)') 
match = pattern.search(ftpfile) 
print match.group(1) 

しかし、拡張子(.SH & .TXT)が含まれていない(&テストをShell_Scripting)のみの一致のファイル名を試してみました。

私は彼らが名前がファイル拡張子インクルードファイルと一致する正しい正規表現がどうあるべきかAttributeError: 'NoneType' object has no attribute 'group'

を表示?re.compile(r'\/(.+\.\w+)')re.compile(r'\/(\w+\.\w+)')

両方を試してみましたか

+0

ファイル名の正規表現にしないでください。スペースはどうですか?ローカルのファイルシステムで許可されている他の面白い文字はどうでしょうか?複数の '.ext.ens.ions'はどうでしょうか?代わりに '18593420'までのパーツと '。+'のグループをマッチさせてから、 'b_i r user1 ftp 0 * c'パーツとマッチさせてください。 – user2722968

+0

@ user2722968思い出してくれてありがとう。はい、空白スペースが問題になるはずです。別の方法を試してみます – Ilikeperl

答えて

2

あなたはリストを使うことができます簡単な正規表現と理解:

import re 

log = """ 
Wed Aug 31 10:23:59 2017 1 ::ffff:172.18.1.168 18593420 /Shell_Scripting.sh b _ i r user1 ftp 0 * c 
Wed Aug 31 10:24:18 2017 1 ::ffff:172.18.1.168 18593420 /test.txt b _ i r user1 ftp 0 * c 
""" 

rx = re.compile(r'/(\S+)') 
filenames = [match.group(1) for line in log.split("\n") for match in rx.finditer(line)] 
print(filenames) 
# ['Shell_Scripting.sh', 'test.txt'] 

心は、少なくとも一つの非空白文字が続く/、探し/(\S+)一部です。

+0

ありがとうございます。あなたの方法は、空白を除くほとんどの状況(複数の拡張子、面白い文字)で機能します。私は空白のスペースに対処しようとします。私を助けてくれてありがとう! – Ilikeperl

-1

あなただけSHのtxtファイルを扱っている場合は、あなたが行うことができます:

pattern = re.compile(r'\/(\w+\.(?:txt|sh))') 
+0

編集:これは今削除されたコメントへの応答でした:afaik '\ w'はアンダースコア/と同じです。 – patrick

1

あなたはre.findallを使用することができます。

import re 

s = ['Aug 31 10:23:59 2017 1 ::ffff:172.18.1.168 18593420 /Shell_Scripting.sh b _ i r user1 ftp 0 * c', 'Wed Aug 31 10:24:18 2017 1 ::ffff:172.18.1.168 18593420 /test.txt b _ i r user1 ftp 0 * c'] 

files = [re.findall("[a-zA-Z_]+\.\w+", i) for i in s] 

new_files = [i[0] for i in files if i] 

出力:

['Shell_Scripting.sh', 'test.txt'] 
関連する問題