2017-07-10 7 views
1

私は、文字列からユーザが質問したすべての単語を持つセットを作ろうとしています。ここでPythonで切り捨てられたテキストを確認してください

# Step 1: Read the string 
instr = 'Lorem ipsum dolor sit amet, unde curabitur nonummy nonummy, cras dui eget, accumsan placerat nibh cumque vel augue, vitae laoreet at. Urna feugiat. Ut ante neque duis neque metus lectus. Neque rutrum tortor adipiscing omnis neque urna, diam vivamus. Pulvinar quis id, porta class felis enim vulputate, tempus arcu, sit porta. Nec praesent orci in, orci id duis purus ultrices, non sit vel. Cras ipsum nibh nulla suspendisse neque, mi dis, vestibulum a ipsum, morbi a curabitur porttitor sodales sit nullam, mus tristique feugiat vel per orci. Lacus elit molestie quam, ac nibh nulla in faucibus quis volutpat. Congue cum massa. Convallis in ultricies eget velit, erat elit eleifend.' 

text_lowercase = instr.lower() 
# Turn them in to set. Easy enough 
all_words = set(text_lowercase) 

# Step 2: Compare with the user's words: 
all_words & user_words 
# And those are the user's words that exist in the text. 

私の質問

lor*、またはcon*などの用語のユーザークエリを仮定しています。 lorまたはconで始まるすべての単語を自分のsetに追加したいと考えています。クイックパスからは、CongueConvallisのような単語があることがわかります。したがって、これらの2はセットに追加する必要があります。

+1

'all_words'を印刷しましたか?私はそれがあなたが期待していることをやっているとは思わない。 – asongtoruin

+0

これまでに何を試しましたか?あなたの努力を示すためにコードをもっと投稿する必要があります。そうしないと、コミュニティがあなたの宿題をやりたがっているように見えます。 Pythonの文字列関数 'split'と' startswith'を見てみましょう。 – Risadinha

+0

ええ、おそらく、あなたが意図しているものを達成するためにセットに変更する前に、その文字列を分割する必要があります。しかし、一般的に、あなたの質問に対する答えは、[regex library](https://docs.python.org/3/library/re.html)の使い方を学ぶことです。 – Brionius

答えて

1

*の代わりに、たとえば\w*を検索し、正規表現としてcon*のようなパターンを使用して検索します。

>>> word = "con*" 
>>> re.findall(word.replace("*", "\w*"), instr.lower()) 
['congue', 'convallis'] 
>>> word = "*val*is" 
>>> re.findall(word.replace("*", "\w*"), instr.lower()) 
['convallis'] 

また、単語の境界を考慮して\b...\bまたは^...$(スプリット文の個々の単語を一致させるとき)にword.replaceの結果を囲むかもしれません。

>>> word = "l*" 
>>> re.findall(r"\b%s\b" % word.replace("*", "\w*"), instr.lower()) 
['lorem', 'laoreet', 'lectus', 'lacus'] 
2

あなたはstr.startswith()でリストの内包表記を使用することができ、このために正規表現を必要としません:

[w for w in instr.split() if w[:3].lower() in {'lor', 'con'}] 

[w for w in instr.split() if w.lower().startswith(('lor', 'con'))] 
# ['Lorem', 'Congue', 'Convallis'] 

またはあなたの接頭辞以来、常に同じ長さ、シンプルinチェックされています

関連する問題