Obțineți orice caracter, cu excepția cifrelor

Încerc să caut un șir care are 6 cifre, dar nu mai pot fi urmate alte caractere. Acesta este regexul pe care îl folosesc \ d {6} [^ \ d] . Din anumite motive, acesta nu captează cifrele pe care \ d {6} le capturează.

Actualizați

Acum, folosesc regexul (\ d {6} \ D *) $ care face semnul. Dar nu pot să o fac să lucreze oricum.

Actualizați 2 - solution

Ar fi trebuit, bineînțeles, să clasifică \ d {6} cu paranteze. Doh! În caz contrar, acesta include cifra non-numerică și încearcă să facă o dată cu asta.

End of Actualizați

Ceea ce incerc sa obtin (ca un hack destul de murdar) este sa gasesti o datastring in antetul unui document openoffice in oricare din urmatoarele formate: YYMMDD , YYYY-MM-DD sau YYYYMMDD . Dacă găsește una dintre aceste (și una singură), aceasta stabilește mtime și atime ale acelui fișier la acea dată. Încercați să creați un fișier odt în/tmp cu 100101 în antet și să executați acest script (exemplu de fișier pentru descărcare: http://db.tt/9aBaIqqa ). Ar trebui să nu schimbe, conform testelor mele, mtime/atime. Dar le veți schimba dacă eliminați \ D în scriptul de mai jos.

Aceasta este sursa mea:

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
0
Definiți că "nu funcționează". Nu reușește să compilați sau să aruncați o excepție? Pierde lucruri care ar trebui să se potrivească? Captează lucruri care nu ar trebui să fie? Vă rugăm să postați un caz care arată eroarea.
adăugat autor djechlin, sursa
'\ d {6} [^ \ d] *'?
adăugat autor Ira Baxter, sursa
@djechlin Ne pare rău. Am programat mult timp de câteva luni. Și eu am întrebat despre SO pentru acel moment. Ar fi trebuit să pun mai bine întrebarea. Încerc să fac o întrebare mai completă ...
adăugat autor Niclas Nilsson, sursa
@ djechlin Sper că este destul de clar ...
adăugat autor Niclas Nilsson, sursa
Da, cum nu funcționează?
adăugat autor Ansari, sursa

3 răspunsuri

Încercați în schimb:

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

(șase cifre urmate de 0 sau mai multe cifre).

Editare: a adăugat un calificativ "trebuie să se potrivească cu sfârșitul șirului".

Editează 2: Oh, pentru numele lui Pete:

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)]

se intoarce

  good, no match
  good, matched
  good, no match
  good, matched
  good, no match
1
adăugat
Dar nu ar fi prins 20120529 ca 201205 ? Nu vreau asta.
adăugat autor Niclas Nilsson, sursa
Nu a reușit să funcționeze: - /
adăugat autor Niclas Nilsson, sursa
Vă mulțumim mult pentru tot ajutorul! Greșeala mea a fost mult mai evidentă. : -/Vedeți actualizarea mea.
adăugat autor Niclas Nilsson, sursa

Puteți utiliza \ D (capitalul D) pentru a se potrivi cu orice caracter din altă cifră.

regex:

\d{6}\D

sir brut: (esti sigur ca esti scapat corect din sir?)

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

şir:

ex = '\\d{6}\\D'
1
adăugat
Acest lucru face exact ceea ce OP are deja, astfel încât nu va rezolva problema.
adăugat autor djechlin, sursa
A fost o modalitate mai bună și mai dificilă de a face acest lucru. Dar nu a funcționat. Cu toate acestea, am găsit o altă eroare în scenariul care a făcut să funcționeze așa cum am exceptat.
adăugat autor Niclas Nilsson, sursa
Dar chiar și așa problema mă deranjează: - /
adăugat autor Niclas Nilsson, sursa

Eram destul de proastă. Dacă adaug un \ D la sfârșitul căutării, căutarea va reveni, desigur, la nici o cifră pe care nu am vrut. A trebuit să adaug paranteză părții pe care am vrut-o cu adevărat. Mă simt destul de proastă pentru că nu o prins cu o declarație de imprimare simplă după buclă. Chiar trebuie să cod mai frecvent.

0
adăugat
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.