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.
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>
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.
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>