python 搜索大文件以查看是否可以找到缺少单词的句子

watbbzwu  于 2022-10-30  发布在  Python
关注(0)|答案(1)|浏览(148)

这是我当前的代码,我有message_list(输入)和书(3686行),需要检查书中是否包含消息。但是消息有空格,"_",一个空格等于一个单词。但是我不知道如何将其解析为我的re参数。我以前从未使用过re,这是我的尝试。

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

书(* 爱丽丝梦游仙境 * 在德国):

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?«

预期输出:

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

和/或其他信息。

已实施@Jeremy Jones回答

def readfile(file, oneline):
if oneline == False:
    if type(file) == str and os.path.exists(file) == True and file.endswith(".txt"):
        with open(file, "r", encoding='utf-8') as f:
            lines = [line.rstrip().lower() for line in f]
        return lines
    else:
        return -1
elif oneline == True:
    if type(file) == str and os.path.exists(file) == True and file.endswith(".txt"):
        line = open(file, "r", encoding='utf-8').read()
        return line
    else:
        return -1

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

mypath = "./Aufgabe1"
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
onlyfiles.remove("Alice_im_Wunderland.txt")

buch = readfile("./Aufgabe1/Alice_im_Wunderland.txt", False)
buch_string = ""

for zeile in buch:
    buch_string = buch_string + str(zeile)

for i in range(len(onlyfiles)):
    stoerung_list = readfile(f"./Aufgabe1/stoerung{i}.txt", True).split()
    print(stoerung_list)
    pattern = "".join(map(word_capture_or_literal, stoerung_list))
    print(pattern)
    result = re.search(pattern, str(buch_string))
    buch_string = str(buch_string).split()
    print(result)

输出

['das', '_', 'mir', '_', '_', '_', 'vor']
 *das(?:\s+\S+) *mir(?:\s+\S+)(?:\s+\S+)(?:\s+\S+) *vor
<re.Match object; span=(18685, 18720), match='das kommt mir gar nicht richtig vor'>
['ich', 'muß', '_', 'clara', '_']
 *ich *muß(?:\s+\S+) *clara(?:\s+\S+)
None
['fressen', '_', 'gern', '_']
 *fressen(?:\s+\S+) *gern(?:\s+\S+)
None
['das', '_', 'fing', '_']
 *das(?:\s+\S+) *fing(?:\s+\S+)
None
['ein', '_', '_', 'tag']
 *ein(?:\s+\S+)(?:\s+\S+) *tag
None
['wollen', '_', 'so', '_', 'sein']
 *wollen(?:\s+\S+) *so(?:\s+\S+) *sein
None

看起来,Jeremy Jones的答案只适用于第一种情况,或者我在实现它时犯了一个错误。我唯一的猜测是我需要用一个特定的名称来创建每个模式。

icomxhvb

icomxhvb1#

如果下划线可以代表一个单词,那么您可以将它们从下划线改为“单个单词匹配”,然后在构造匹配文本的正则表达式时,您可以根据需要将其设置为可选或多个。您只需要注意空格,因为单词之间通常只有一个空格,但模式也会捕获空格,因此*可能很有用,如下所示:


# !/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)

结果,找到了一句话还行:

% python foo.py
<_sre.SRE_Match object at 0x10cd73b28>

相关问题