35

このパターンを示す次のファイル名があります。

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

'_'2番目のアンダースコアの後と の前の中間の2つのタイムスタンプ部分を抽出したい'.txt'。そこで、次の Python 正規表現文字列分割を使用しました。

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

しかし、これにより、返されたリストに 2 つの空の文字列が追加されます。

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

2 つのタイム スタンプ情報だけを取得するにはどうすればよいですか? つまり、私が欲しい:

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

5 に答える 5

27

私は Python の専門家ではありませんが、空の文字列をリストから削除することはできますか?

str_list = re.split('^[0-9]+_[LU]_|-|\.txt$', f)
time_info = filter(None, str_list)
于 2013-05-30T16:06:37.593 に答える
22

は使用せず、正規表現/オブジェクトre.split()のメソッドを使用してください。groups()MatchSRE_Match

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

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

于 2013-05-30T16:12:24.007 に答える
3

タイムスタンプが常に秒の後にある場合は、 and_を使用できます。str.splitstr.strip

>>> strs = "000014_L_20111007T084734-20111008T023142.txt"
>>> strs.strip(".txt").split("_",2)[-1].split("-")
['20111007T084734', '20111008T023142']
于 2013-05-30T16:10:05.763 に答える
3

これはグーグルで出てきたので、完全を期すためにre.findall、代替として使用してみてください!

これには少し考え直す必要がありますが、依然として split のように一致のリストを返します。これにより、一部の既存のコードを簡単に置き換えることができ、不要なテキストが削除されます。先読みや後読みと組み合わせると、非常によく似た動作が得られます。

はい、これは少し「あなたは間違った質問をしている」という答えであり、re.split(). それは根本的な問題を解決します-一致のリストに突然長さゼロの文字列が含まれるようになり、それは望ましくありません。

于 2020-05-05T14:46:08.757 に答える
1
>>> f='000014_L_20111007T084734-20111008T023142.txt'
>>> f[10:-4].split('-')
['0111007T084734', '20111008T023142']

または、もう少し一般的に:

>>> f[f.rfind('_')+1:-4].split('-')
['20111007T084734', '20111008T023142']
于 2013-05-30T16:10:34.513 に答える