2014-10-15 11 views
6

Quindi devo:Controllare se la stringa presente in un file di testo

def CheckUserExists(user): 
    with open("C:/~/database.txt", 'r') as file: 
     if re.search(user, file.read()): 
      return True 
     else: 
      return False 

username = input("Please enter you Username: ") 
if CheckUserExists(username) == True: 
    print("You exist!") 
else: 
    print("This user does not exist...") 

Tuttavia, se si inserisce ad esempio la lettera 'a' e l'utente chiamato è un 'cervello'; la ricerca preleva la a e restituisce True. Come posso cercare parole intere?

Ho guardato qui: How to check in Python if string is in a text file and print the line? tuttavia non capisco il pezzo di codice:

re.search("\b{0}\b".format(w),line) 
+0

'\ b' è utilizzato per il limite della parola. – fredtantini

+3

RE sembra eccessivo, perché non basta vedere 'se l'utente in file.read()'. Oppure leggi il file riga per riga. – squiguy

+0

Qual è il formato di questo file? –

risposta

3

L'espressione regolare, \b, refers to the empty string at a word boundary, in cui parola è \w+, o [A-Za-z0-9_]+

Se si dispone di un nome per riga (senza altri spazi bianchi attorno ai nomi), puoi cercare per riga con ^{0}$ con lo re.M o re.MULTILINE flag

Che sarebbe simile a questa:

def CheckUserExists(user): 
    with open("C:/~/database.txt", 'r') as file: 
     if re.search('^{0}$'.format(re.escape(user)), file.read(), flags=re.M): 
      return True 
     else: 
      return False 

username = input("Please enter you Username: ") 
if CheckUserExists(username): # it's redundant to check if == True here 
    print("You exist!") 
else: 
    print("This user does not exist...") 

Anche se un commento e una risposta suggeriscono, se non

if user in file.read() 

si possono avere falsi positivi.

+0

usa 'return bool (x)' invece di 'if x: return True else: return False'. Usa 'se x:' invece di 'if x == True:' – jfs

+0

vuoi ''^ {} $'. Format (re.escape (user))' se 'utente' potrebbe contenere metacaratteri regex. – jfs

+0

@ J.F.Sebastian puoi darmi un esempio di tale nome? Nah, questa è probabilmente una buona idea, sconfiggere gli scopi malevoli, suppongo. : D –

0

La riga di codice di riferimento è una regular expression. Fondamentalmente ciò che fa in questo caso è garantire che un limite di parola (designato con \b) esista attorno alla stringa che stai cercando, il che impedirà la corrispondenza di sottostringhe come quella che stai vedendo.

0

Regex sembra un po 'troppo complicato per l'attività ... userò .split() di dividere ogni riga nel file

def CheckUserExists(user): 
    with open("C:/~/database.txt", 'r') as file: 
    for line in file: 
     if user in line.split(): 
     return True 
    else: 
     return False 

Questo per un file database.txt fatta '' 'come' '' un database con spazi tra gli utenti. Abbiamo bisogno di un piccolo estratto dei dati di origine per darti una risposta coerente.

Se gli utenti sono delimitati da caratteri speciali (citazioni, punti, virgole, ecc ..) userò .replace("delimitingcharacter", " ") ..

def CheckUserExists(user): 
    with open("C:/~/database.txt", 'r') as file: 
    for line in file: 
     for word in line.split(): 
     if user in word.replace(';', ' '): 
      return True 
     else: 
      return False 
1

Per verificare se una parola separate da spazi esiste in un file:

with open(filename) as file: 
    found = (word in file.read().split()) 

o lo stesso ma la lettura riga per riga invece di caricare tutto in memoria:

with open(filename) as file: 
    found = any(word in line.split() for line in file) 

Se il formato del file è una parola (/ utente) per linea:

with open(filename) as file: 
    found = any(word == line.strip() for line in file) 

Non hai bisogno di espressioni regolari in casi semplici. Se ci potrebbe essere più parole per riga e ci potrebbe essere la punteggiatura arbitraria all'interno di allora si potrebbe utilizzare l'espressione regolare che hai collegato:

import re 

matched = re.compile(r"\b" + re.escape(word) + r"\b").search 
with open(filename) as file: 
    found = any(matched(line) for line in file) 

\b espressione regolare corrisponde a un limite di parola (inizio o la fine di una parola) . I caratteri di Word sono lettere, cifre e underscore.re.escape() viene utilizzato nel caso word contiene metacaratteri regolari come *.

Problemi correlati