2013-02-19 17 views
8

Sto analizzando un file con un elenco di percorsi. Sto cercando di vedere se un percorso è sotto una directory specifica o no. Quindi ho due stringhe S1 e S2. Diciamo che sono S1 = '/ tmp /' e S2 = '/tmp/file.txt'strncmp in python

Se voglio verificare se S2 ha S1 e poi alcuni byte in più in C, vorrei fare un strncmp di S1 ​​e S2 fino a strlen (S1) byte. C'è un modo per farlo in Python? Sono nuovo di Python e non conosco ancora tutti i moduli disponibili. Potrei implementarlo banalmente semplicemente iterando i caratteri nelle stringhe e confrontandoli, ma voglio scoprire se c'è qualcosa che mi dà questo tipo di funzioni di supporto di default

Grazie per qualsiasi aiuto.

P

risposta

11

Sì. Si può fare: if a in b: Che verificherà se a è una sottostringa ovunque in b.

ad es.

if 'foo' in 'foobar': 
    print True 

if 'foo' in 'barfoo': 
    print True 

Dal tuo post, sembra che tu voglia solo guardare l'inizio delle stringhe. In tal caso, è possibile utilizzare il metodo .startswith:

if 'foobar'.startswith('foo'): 
    print "it does!" 

Allo stesso modo, si può fare la stessa cosa con endswith:

if 'foobar'.endswith('bar'): 
    print "Yes sir :)" 

infine, forse la traduzione più letterale di strncmp sarebbe quella di utilizzare per affettare e ==:

if a[:n] == b[:n]: 
    print 'strncmp success!' 

Python ha anche molte strutture per la gestione dei nomi di percorso nelModulo. Vale la pena indagare su cosa c'è lì dentro. Ci sono alcune funzioni abbastanza ordinate.

+0

Il vostro è probabilmente più divinatorio, ma penso che affettare dovrebbe anche essere considerato. +1 – 0xC0000022L

+1

Wow. Questo è esattamente il tipo di cosa che speravo avesse Python. Mi è stato detto che Python è fantastico e finora non è stato deluso. – R11

+0

@ R11 - python ha alcune qwirks che quasi inciampano all'inizio, ma una volta che le hai trovate, è davvero una gioia lavorare con te. In bocca al lupo! – mgilson

2

Probabilmente stai cercando os.path.commonprefix.

ad esempio: os.path.commonprefix(['/tmp/','/tmp/file.txt']) tornerà '/tmp/

così si dovrebbe verificare la presenza di len(os.path.commonprefix([s1,s2])) > 0

Partenza docs qui: http://docs.python.org/2/library/os.path.html

+0

Questa è un'interpretazione interessante del problema. +1 per pensare fuori dagli schemi. – mgilson

+0

Bello! Mi piace molto anche questo. Gestisce anche le notazioni specifiche del sistema operativo come i percorsi di Windows che iniziano con "C: \\ tmp \" invece di "/ tmp /"? Non ho avuto questo a metà del tutto quando ho postato. Speravo solo di trovare alcuni trucchi per la maniolatura delle corde. Ma fantastico! – R11

+0

Ad essere sincero non sono sicuro di come funzioni con Windows e non ho finestre per controllarmi, ma immagino che no. Sembra un modo più accurato per verificare se un percorso è un sottotracciato. Ho appena notato che stavi facendo una manipolazione del percorso che C potrebbe non avere un modulo specializzato, ma python ha 'os.path'. Molti programmatori arrivano a Python da altri sfondi e reinventano queste funzioni (in modi non portabili di solito), quindi ho pensato che fosse una buona idea mostrare la libreria standard. Ricorda, Python viene fornito con batterie incluse: D – rgrinberg

0

è possibile utilizzare il metodo find di una stringa

>>> s1 = "/tmp" 
>>> s2 = "/tmp/file.txt" 
>>> s2.find(s1) 
0 
1

Puoi provarlo con

S2[:len(S1)] == S1 

o ancora più semplice:

S2.startswith(S1)