这是我当前的代码,我有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的答案只适用于第一种情况,或者我在实现它时犯了一个错误。我唯一的猜测是我需要用一个特定的名称来创建每个模式。
1条答案
按热度按时间icomxhvb1#
如果下划线可以代表一个单词,那么您可以将它们从下划线改为“单个单词匹配”,然后在构造匹配文本的正则表达式时,您可以根据需要将其设置为可选或多个。您只需要注意空格,因为单词之间通常只有一个空格,但模式也会捕获空格,因此
*
可能很有用,如下所示:结果,找到了一句话还行: