2017-04-30 11 views
3

私は現在「退屈なものを自動化する」という作業を行っています。私は第8章「Mad Libs」の練習プロジェクトに参加しています。次のようにタスクは次のとおりです。Regexを使用して一致の各インスタンスを別の文字列に置き換えます。

は、テキストFLESを読み込み、ユーザーがどこでも単語形容詞、名詞、副詞、またはVERBテキストファイル内 表示され 、独自のテキストを追加することができますマッドリブスプログラムを作成します。たとえば、テキストFLEは、次のようになります。

The ADJECTIVE panda walked to the NOUN and then VERB. A nearby NOUN was unaffected by these events. 

プログラムは、これらの発生を見つけ、それらを交換 にユーザを促します。

は形容詞を入力します:愚かな

は名詞を入力します:シャンデリア

は動詞を入力します。

を叫んだが名詞を入力します:ピックアップトラック

次のテキストファイルは、作成されます:

The silly panda walked to the chandelier and then screamed. A nearby pickup truck was unaffected by these events. 

画面に印刷され、新しいテキストファイルに保存されます。このプログラムの動作与え例えば

#! python3 
# Requests user for an ADJECTIVE, NOUN, ADVERB, and a NOUN 
# Replaces the words ADJECTIVE/NOUN/ADVERB/NOUN with the input in a txt file 
# Saves the new Mad Lib as a new txt file 

import re 

reADJECTIVE = re.compile(r'''(ADJECTIVE)''') 
reNOUN = re.compile(r'''(NOUN)''') 
reVERB = re.compile(r'''(VERB)''') 

for i in range(1): 
    # Gets user input for ADVECTIVE/NOUN/VERB/NOUN 
    ADJECTIVE = input('Enter an adjective: ') 
    NOUN = input('Enter a noun: ') 
    VERB = input('Enter a verb: ') 
    NOUN2 = input('Enter a noun: ') 

    madLibFile = open('madlib%s.txt' % (i + 1)) 
    madLibFileContent = madLibFile.read() 
    madLibFile.close() 
    madLibFileContent = madLibFileContent.split('. ') 
    print(madLibFileContent) 

    newMadLib = re.sub(reADJECTIVE, ADJECTIVE, madLibFileContent[0]) 
    newMadLib = re.sub(reNOUN, NOUN, newMadLib) 
    newMadLib = re.sub(reVERB, VERB, newMadLib) 
    newMadLib = newMadLib + '. ' + re.sub(reNOUN, NOUN2, madLibFileContent[1]) 

    print(newMadLib) 

が原因私は、それはときにのみ機能し、それはfullstop /期間によってで読み込むファイルを区切る方法を、次のように

私の現在のプログラムがあります入力ファイルのフォーマットは、

ADJECTIVE NOUN ADVERBです。名詞。

とのような他の形式のために動作しないでしょう。

形容詞名詞。 ADVERB NOUN。我々は、任意のマッドLibは形容詞・名詞・動詞・名詞の同じパターンに従って仮定すれば、この作品

(ADJECTIVE).*(NOUN).*(VERB).*(NOUN) 

私の最初のアイデアは、正規表現パターンを使用することでした。

私が使用した場合:

re.sub(r'(NOUN)', replacement, someString) 

それは交換した文字列でNOUNのこれまでのインスタンスを置き換えます。各キャプチャグループを異なるものに置き換えることは可能ですか?

はお時間をいただき、ありがとうございます、と私は質問が明確で十分だった願っています:)

答えて

2

トリックはre.subで置き換える文字列の代わりに機能を使用することです。ここにはそれを行うための原油の方法があります。

import re 

sentence = 'The ADJECTIVE panda walked to the NOUN and then VERB. A nearby NOUN was unaffected by these events.' 

def consider(matchobj): 
    content = matchobj.group() 
    if content in ['NOUN', 'ADJECTIVE', 'ADVERB', 'VERB']: 
     return input('Please enter ' + content) 
    else: 
     return content 

print (re.sub('[A-Z]+', consider, sentence)) 

私はあなたの言葉を使用するのは苦労しませんでした。使用方法は次のとおりです。

Please enter ADJECTIVEbig 
Please enter NOUNbear 
Please enter VERBgoes 
Please enter NOUNhome 
The big panda walked to the bear and then goes. A nearby home was unaffected by these events. 

EDIT:コメントに応じて追加されました。

import re 

partsOfSpeech = ['NOUN', 'ADJECTIVE', 'ADVERB', 'VERB'] 
replacements = {_:'' for _ in partsOfSpeech} 

for r in replacements: 
    replacements[r] = input('Please enter ' + r.lower() + ': ') 

madLibs = [ 
    'The ADJECTIVE panda walked to the NOUN and then VERB. A nearby NOUN was unaffected by these events.', 
    'A NOUN ADVERB decided to VERB the NOUN' 
    ] 

def consider(matchobj): 
    content = matchobj.group() 
    if content in partsOfSpeech: 
     return replacements[content] 
    else: 
     return content 

for madLib in madLibs: 
    print (re.sub('[A-Z]+', consider, madLib)) 

結果:

Please enter adjective: vast 
Please enter adverb: smoothly 
Please enter verb: went 
Please enter noun: bear 
The vast panda walked to the bear and then went. A nearby bear was unaffected by these events. 
A bear smoothly decided to went the bear 
+0

私は種類のそれがどのように機能するかを理解します。しかし、これは、ユーザーがMad Libごとに新しい形容詞/名詞/等を入力する必要はありませんか?私が達成しようとしているのは、ユーザが形容詞/名詞/等を入力し、ファイル単位ではなく、任意の数のファイルに置き換えるということです。 –

+0

あなたはそうです。私はより大きなスクリプトを書いた。スクリプトは置換単語を辞書に保存します。正規表現と一致する場合に呼び出される関数で使用できます。いくつかのファイルを作成するのではなく、私はちょうど2つの文のリストを作成しました。 –

+0

もう一度ご協力いただきありがとうございます。しかし、私はさらなる質問があります。あなたが与えた例では、これは複数の名詞を許さない。たとえば、ADJECTIVE、NOUN、VERB、NOUNの上で概説したパターンでは、ユーザーが毎回異なる名詞を入力した場合、1つだけが置換の対象とみなされます。 –