0

6桁の文字列を検索しようとしていますが、他の文字が続く可能性があります。これは私が使用する正規表現です\d{6}[^\d]。何らかの理由で、キャッチする数字をキャッチしません\d{6}

アップデート

今、私は正規表現(\ d {6} \ D *)$を使用しています。しかし、とにかくそれを動作させることはできません。

アップデート2-ソリューション

もちろん、\d{6}を括弧でグループ化する必要があります。ドー!それ以外の場合は、数字を含まず、それを使用して日付を作成しようとします。

更新の終了

私が(かなり汚いハックとして)達成しようとしているのは、openofficeドキュメントのヘッダーで次のいずれかの形式の日付文字列を見つけることです:YYMMDDYYYY-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
4

3 に答える 3

1

代わりにこれを試してください:

r'(\d{6}\D*)$'

(6桁の後に0個以上の非桁が続く)。

編集:「文字列の終わりに一致する必要がある」修飾子を追加しました。

Edit2:ああ、ピートのために:

import re

test_strings = [
    ("12345", False),
    ("123456", True),
    ("1234567", False),
    ("123456abc", True),
    ("123456ab9", False)
]

outp = [
    "  good, matched",
    "FALSE POSITIVE",
    "FALSE NEGATIVE",
    "  good, no match"
]

pattern = re.compile(r'(\d{6}\D*)$')
for s,expected in test_strings:
    res = pattern.match(s)
    print outp[2*(res is None) + (expected is False)]

戻り値

  good, no match
  good, matched
  good, no match
  good, matched
  good, no match
于 2012-05-29T18:14:50.247 に答える
1

(大文字のD)を使用\Dして、数字以外の任意の文字と一致させることができます。

正規表現:

\d{6}\D

生の文字列:(文字列を正しくエスケープしていることを確認しますか?)

ex = r"\d{6}\D"

ストリング:

ex = '\\d{6}\\D'
于 2012-05-29T18:04:41.103 に答える
0

私はかなり愚かでした。検索の最後にを追加する\Dと、もちろん、検索では、必要のない数字も返されません。本当に欲しかった部分にかっこを付けなければなりませんでした。ループ後の単純なprintステートメントでこれをキャッチできないのはかなり愚かです。私は本当にもっと頻繁にコーディングする必要があります。

于 2012-05-29T19:12:34.523 に答える