J'essaie actuellement de résoudre une solution où j'ai une valeur et un fichier texte (.txt) où je veux vérifier si la valeur dans le code se trouve quelque part dans le fichier texte.
Ce que j'ai fait actuellement, c'est que j'ai un fichier texte qui ressemble à:
def check_all(sentence, ws): return all(re.search(r'\b{}\b'.format(w), sentence) for w in ws)
et un code qui ressemble à:
Exception in thread Thread-2: Traceback (most recent call last): File "C:\Users\PC\AppData\Local\Programs\Python\Python36\lib\threading.py", line 916, in _bootstrap_inner self.run() File "C:\Users\PC\AppData\Local\Programs\Python\Python36\lib\threading.py", line 864, in run self._target(*self._args, **self._kwargs) File "C:/Users/test.py.py", line 324, in filter if any(check_all(sentence, word) for word in keyword): File "C:/Users/test.py.py", line 324, in <genexpr> if any(check_all(sentence, word) for word in keyword): File "C:/Users/test.py.py", line 321, in check_all return all(re.search(r'\b{}\b'.format(w), sentence) for w in ws) File "C:/Users/test.py.py", line 321, in <genexpr> return all(re.search(r'\b{}\b'.format(w), sentence) for w in ws) File "C:\Users\PC\AppData\Local\Programs\Python\Python36\lib\re.py", line 182, in search return _compile(pattern, flags).search(string) TypeError: expected string or bytes-like object
Qu'est-ce que le script fait est:
qu'il a un nom_élément qui a une valeur. Ouvre le mot-clé où tous les mots-clés sont stockés
Avec la fonction check_all et pour la phrase dans les phrases: mon idée était de vérifier si le mot-clé correspond dans le fichier txt. Et si c'est le cas, nous continuons simplement le programme et si ce n'est pas le cas, nous imprimons Supprimé le mot-clé et sys.exit le programme.
Cependant, lorsque j'essaie d'exécuter ce programme maintenant, j'obtiens une erreur en disant
def filter(): item_name = '1128062' keyword = [line.rstrip('\n') for line in open('keywords.txt')] has_good = False sentences = [item_name] def check_all(sentence, ws): return all(re.search(r'\b{}\b'.format(w), sentence) for w in ws) for sentence in sentences: if any(check_all(sentence, word) for word in keyword): has_good = True break if not has_good or keyword == "": print("Removed the keyword - " + str(item_name)) sys.exit()
J'ai réalisé qu'il doit y avoir un problème concernant
999486 1117978 990583 1128062 1120618
et c'est là que j'ai le problème et je vous le demande comment je peux être en mesure de vérifier si le mot-clé correspond dans un fichier .txt et s'il ne correspond pas, nous imprimons Supprimé le mot-clé et sys.exit le programme, s'il correspond alors nous ne ne fais rien.
3 Réponses :
En supposant que vous vouliez simplement imprimer true
si le mot-clé
est dans le fichier, False
si le mot-clé
n'est pas dans le fichier .. essayez d'exécuter le code ci-dessous ...
fichier texte ::
999486
1117978
990583
1128062
1120618
programme ::
def match_string(text): result = False keyword = [line.rstrip('\n') for line in open('keyword.txt')] if text in keyword: result = True return result match_string('999487')
renvoie True
Remarque : Je ne comprends toujours pas si vous devez faire correspondre une chaîne entière ou chaque caractère d'une chaîne ...
Je veux juste faire correspondre la chaîne entière pour qu'elle corresponde essentiellement au fichier txt :) Donc, etc "123456" doit correspondre à "123456" et non par caractères! - Btw n'ai-je pas besoin de parcourir le mot-clé dans ce cas?
Donc, le problème ici est qu'il quitte le programme car je pense qu'il ne passe pas en boucle par le mot-clé?
Si vous voulez voir si «123456» existe dans un fichier et que le fichier a une ligne qui est «123456789», est-ce une correspondance ou une non-correspondance? Si cela devait être une correspondance, alors vous ajouteriez simplement pour k dans le mot-clé
pour envelopper le si texte dans le mot-clé
et le changer en si le texte dans k code>.
Alors répondez à votre question. Cela ne devrait PAS être une correspondance dans ce cas. Cela signifie que si nous voulons voir '123456', nous trouvons juste après une chaîne qui a '123456' (Doit être exactement la même chose) :) @Endyd
alors la réponse réside dans le code ci-dessus. Il supprime simplement tous les mots-clés du fichier texte dans une liste, puis correspond au mot-clé requis et renvoie True
si trouvé sinon False code > ...
Convenu. Acceptez ceci comme réponse. Maintenant que vous mentionnez que la correspondance exacte est souhaitée, vous n'aurez peut-être même pas besoin de faire if text in keyword
, mais plutôt de faire if text == keyword
. J'imagine que python effectue d'abord une vérification de str.size (), de sorte qu'il détecte la plupart des cas d'incompatibilité plus rapidement en temps O (1) si les longueurs sont différentes. Vérification de si le texte dans le mot-clé
serait O (n) si le texte
est plus court que le mot-clé
Le module re n'est pas nécessaire ici, car il semble que nous recherchons simplement une correspondance de chaîne.
import sys KEYWORDS_PATH = 'keyword.txt' KEYWORDS = open(KEYWORDS_PATH).read().splitlines() sentences = ['999487'] for sentence in sentences: if sentence in KEYWORDS: print('Removed the keyword - %s' % sentence) sys.exit()
Ouais, il semble que c'était la réponse honnêtement! J'ai essayé cela et j'ai fini par avoir ce que je voulais!
Vous pouvez essayer ceci:
text = "Some dummy text with numbers 123" tokens = text.split(" ") num = "123" # Number as string if num in token: print("True") else : print("False")
@NoorJafri Bonjour! Hmm, je ne suis pas sûr mais je pense que c'est la raison pour laquelle j'obtiens une erreur car il est indiqué sur la sortie d'erreur
File "C: /Users/test.py.py", ligne 321, dans code > Je crois que le problème est
pour w dans ws
qui, je crois, imprime caractère par caractère?Je ne parviens pas à reproduire l'erreur lorsque j'exécute votre extrait de code. Pouvez-vous essayer de diffuser votre
w
en tant questr
? Comme suit:renvoie tout (re.search (r '\ b {} \ b'.format (str (w)), phrase) pour w dans ws)
Très bien, ce que je viens d'essayer et de réaliser, c'est que
pour w dans ws
est-ce qu'il boucle caractère par caractère dont je ne sais pas si cela pourrait être la raison pour laquelle il échoue? Parce que j'ai essayé d'imprimerws
qui m'a donné le mot-clé entier etpour w dans ws
me donne caractère par caractère. @EndydBon, puisque dans la boucle for, vous avez une boucle for imbriquée, donc vous allez mot-clé par mot-clé dans la boucle for externe (
for phrase in phrases
), puis vous allez char par char dans le < code> le cas échéant instruction lorsque vous ditespour mot dans mot-clé
, ce qui est vraimentpour char dans mot-clé
Ouais je le crois aussi. Je pense que cela pose le problème. Cela signifie donc que j'ai besoin de résoudre d'une manière ou d'une autre qui vérifie si
phrase
est dansmot-clé
quelque chose de cette façon?Désolé, je me suis peut-être trompé. Je pensais que
phrases
étaient les mots-clés, mais je vois que ce n'est qu'une liste de nom_élément à rechercher. Les noms de variables me déroutaient.Ohhh, je pense que je me suis plus confus que toi en fait haha. Je pense que j'ai trop compliqué cela plus que je ne le devrais. @Endyd