6桁の文字列を検索しようとしていますが、他の文字が続く可能性があります。これは私が使用する正規表現です\d{6}[^\d]
。何らかの理由で、キャッチする数字をキャッチしません\d{6}
。
アップデート
今、私は正規表現(\ d {6} \ D *)$を使用しています。しかし、とにかくそれを動作させることはできません。
アップデート2-ソリューション
もちろん、\d{6}を括弧でグループ化する必要があります。ドー!それ以外の場合は、数字を含まず、それを使用して日付を作成しようとします。
更新の終了
私が(かなり汚いハックとして)達成しようとしているのは、openofficeドキュメントのヘッダーで次のいずれかの形式の日付文字列を見つけることです:YYMMDD
、YYYY-MM-DD
またはYYYYMMDD
。これらの1つ(および1つのみ)が見つかった場合は、そのファイルのmtimeとatimeをその日付に設定します。ヘッダーを含む/tmpにodtファイルを作成し、100101
このスクリプトを実行してみてください(ダウンロードするサンプルファイル:http://db.tt/9aBaIqqa)。私のテストによると、mtime/atimeを変更するべきではありません。ただし、以下のスクリプトで\ Dを削除すると、それらが変更されます。
これが私の情報源のすべてです:
import zipfile
import re
import glob
import time
import os
class OdfExtractor:
def __init__(self,filename):
"""
Open an ODF file.
"""
self._odf = zipfile.ZipFile(filename)
def getcontent(self):
# Read file with header
return self._odf.read('styles.xml')
if __name__ == '__main__':
filepattern = '/tmp/*.odt'
# Possible date formats I've used
patterns = [('\d{6}\D', '%y%m%d'), ('\d{4}-\d\d-\d\d', '%Y-%m-%d'), ('\d{8}', '%Y%m%d')]
# go thru all those files
for f in glob.glob(filepattern):
# Extract data
odf = OdfExtractor(f)
# Create a list for all dates that will be found
findings = []
# Try finding date matches
contents = odf.getcontent()
for p in patterns:
matches = re.findall(p[0], contents)
for m in matches:
try:
# Collect regexp matches that really are dates
findings.append(time.strptime(m, p[1]))
except ValueError:
pass
print f
if len(findings) == 1: # Don't change if multiple dates was found in file
print 'ändrar till:', findings[0]
newtime = time.mktime(findings[0])
os.utime(f, (newtime, newtime))
print '-' * 8