2013-05-30 3 views
16

私はこのパターンを示す以下のファイル名を持っている:空の文字列なしでPythonの正規表現の分割

000014_L_20111007T084734-20111008T023142.txt 
000014_U_20111007T084734-20111008T023142.txt 
... 

私は2番目のアンダースコア'_'後と'.txt'前中央の2つのタイムスタンプの部分を抽出したいです。だから私は、次のPythonの正規表現文字列の分割使用:

time_info = re.split('^[0-9]+_[LU]_|-|\.txt$', f) 

をしかし、これは返されたリスト内の2つの余分な空の文字列私に与える:私は2つのだけのタイムスタンプ情報を取得するにはどうすればよい

time_info=['', '20111007T084734', '20111008T023142', ''] 

?すなわち、私がしたい:

time_info=['20111007T084734', '20111008T023142'] 

答えて

12

しないでくださいre.split()を使用する場合は、groups()のmeth正規表現のod Match/SRE_Matchオブジェクトです。

>>> f = '000014_L_20111007T084734-20111008T023142.txt' 
>>> time_info = re.search(r'[LU]_(\w+)-(\w+)\.', f).groups() 
>>> time_info 
('20111007T084734', '20111008T023142') 

あなたも、キャプチャグループに名前を付け、あなたはそのためのgroupdict()ではなくgroups()を使用しても、辞書でそれらを取得することができます。 (そのような場合の正規表現パターンはr'[LU]_(?P<groupA>\w+)-(?P<groupB>\w+)\.'のようになります)

+0

これは素晴らしい解決策です。ありがとう。 – tonga

+8

「分割」には「空の文字列なし」オプションがありません。 – Elazar

+1

@Elazar実際には、 're.split()'がどのように実装され、その意図された目的が何であるかの問題です。このような場合、望ましくないすべてのものと一致するものを構築するよりも、望ましいデータのパターンを構築する方が理にかなっています。 (セパレータが指定されていない場合、 'str.split()'は空文字列を実際にはドロップしませんが、 'None'を返します)。 – JAB

13

は、私は、Pythonの専門家だが、多分あなたは自分のリストから空の文字列を削除するだろうか?

time_info = re.split('^[0-9]+_[LU]_|-|\.txt$', f) 
time_info = filter(None, str_list) 
+0

これは機能します。ありがとう。 're.split()'関数を使ってワンパス・ソリューションがあるのだろうかと思います。 – tonga

+0

@tongaありがとうございます: 'time_info = [x for re.split( '^ [0-9] + _ [LU] _ | - | \ .txt $'、f)if x] ' – FraggaMuffin

+0

filter()はフィルタオブジェクトを返しますので、後でlist()を使う必要があります。' time_info = list(filter(None、str_list)) ' –

2

タイムスタンプが二_後に常にあるなら、あなたはstr.splitstr.stripを使用することができます。

>>> strs = "000014_L_20111007T084734-20111008T023142.txt" 
>>> strs.strip(".txt").split("_",2)[-1].split("-") 
['20111007T084734', '20111008T023142'] 
+0

REを使わないでこれらのことをするのが大好きです。どうしてか分かりません。 – Elazar

+0

@Ashwini:ありがとう。これは機能します。しかし、私はどのように正規表現の分割でこれを行うことができますか? – tonga

+0

@Elazar正規表現は間違ってやってしまったり、あまりにも複雑で、コメントがないとかなり謎かもしれないと思う。一連の関数呼び出しとして構築されたときに、REで行われる文字列操作が理解しやすくなることがあります。 (この場合、 'split()'/'strip()' /要素のアクセス操作は、REを使うよりも厄介です。 – JAB

1
>>> f='000014_L_20111007T084734-20111008T023142.txt' 
>>> f[10:-4].split('-') 
['0111007T084734', '20111008T023142'] 

か、もう少し一般:

>>> f[f.rfind('_')+1:-4].split('-') 
['20111007T084734', '20111008T023142'] 
関連する問題