Search large file to see if a sentence with missing words can be found

Question:

This is my current code, I have the message_list (the input) and the book (3686 lines) and need to check if the book contains the message. But the message has gaps, "_", and a gap equals a word. But I don’t know how to parse this into my re arguments. I have never worked with re before and that was my try on this.

message_list = ["das", "_", "mir", "_", "_", "_", "vor"]
book = readfile("Book.txt", False)
print(re.search(rf"^{message_list[0]}.${message_list[len(message_list)-1]}", str(book)))

Book (Alice in Wonderland in German):

So fingen sie denn an, feierlich im Kreise um Alice zu tanzen; zuweilen
traten sie ihr auf die Füße, wenn sie ihr zu nahe kamen; die falsche
Schildkröte sang dazu, sehr langsam und traurig, Folgendes: --

Zu der Schnecke sprach ein Weißfisch: »Kannst du denn nicht
        schneller gehn?
    Siehst du denn nicht die Schildkröten und die Hummer
        alle stehn?
    Hinter uns da kommt ein Meerschwein, und es tritt mir auf
        den Schwanz;
    Und sie warten an dem Strande, daß wir kommen zu
        dem Tanz.
    Willst du denn nicht, willst du denn nicht, willst du kommen
        zu dem Tanz?
    Willst du denn nicht, willst du denn nicht, willst du kommen
        zu dem Tanz?«

 »Nein, du kannst es nicht ermessen, wie so herrlich es wird sein,
    Nehmen sie uns mit den Hummern, werfen uns in's Meer hinein!«
    Doch die Schnecke thät nicht trauen. »Das gefällt mir doch nicht ganz!
    Viel zu weit, zu weit! ich danke -- gehe nicht mit euch zum Tanz!
    Nein, ich kann, ich mag, ich will nicht, kann nicht kommen zu dem Tanz!
    Nein, ich kann, ich mag, ich will nicht, mag nicht kommen zu dem Tanz!«

 Und der Weißfisch sprach dagegen: »'s kommt ja nicht drauf an, wie
        weit!
    Ist doch wohl ein andres Ufer, drüben auf der andern Seit'!
    Und noch viele schöne Küsten giebt es außer Engelland's;
    Nur nicht blöde, liebe Schnecke, komm' geschwind mit mir zum Tanz!
    Willst du denn nicht, willst du denn nicht, willst du kommen zu dem
        Tanz?
    Willst du denn nicht, willst du denn nicht, willst nicht kommen zu dem
        Tanz?«

Excpected Output:

["das","_","mir","_","_","_","vor"]
Line 127 : ...
Line 256 : ...

and so on.

Asked By: Oskar_GER

||

Answers:

If the underscores can represent one word, then you can change them from underscores into a "single word match", which you can then make optional or multiple as required, in constructing a regular expression to match against the text. You just have to be careful about spaces, since there’s normally a single space between words but the pattern also captures spaces, so * can be useful, as below:

#!/usr/bin/env python                                                                                                                                                                        
# -*- coding: utf-8 -*-                                                                                                                                                                      

import re

book = """icht, kann nicht kommen zu dem Tanz!                                                                                                                                               
  Nehmen sie uns mit den Hummern, werfen uns in's Meer hinein!«                                                                                                                              
    Doch die Schnecke thät nicht trauen. »Das gefällt mir doch nicht ganz!                                                                                                                   
    Viel zu weit, zu weit! ich danke -- gehe nicht mit euch zum Tanz!                                                                                                                        
    foo das foo mir bar one two vor foo                                                                                                                                                      
    Nein, ich kann, ich mag, ich will nicht, kann nicht kommen                                                                                                                               
    Nein, ich kann, ich mag, ich will nicht, mag nicht kommen zu dem Tanz!«~"""

def word_capture_or_literal(w): # _ matches a single word
   return '(?:s+S+)' if w == "_" else " *" + w                                                                                                                

message_list = ["das","_","mir","_","_","_","vor"]
pattern = "".join(map(word_capture_or_literal, message_list))
result = re.search(pattern, book)

print(result)

Result, finding the words ok:

% python foo.py
<_sre.SRE_Match object at 0x10cd73b28>
Answered By: Jeremy Jones
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.