1

文を受け取り、少なくとも長さが 4 で小文字の単語を返す関数を定義したいと考えています。問題は、私は Python にかなり慣れていないため、整数ではなく単語を扱うコードを作成する方法がよくわからないことです。私の現在のコードは次のとおりです。

def my_function(s):
    sentence = []
    for word in s.split():
        if len(word) >=4:
            return (word.lower())

StackOverflow と Python チュートリアルで見たものから、コードがどこに出力されるかmy_function("Bill's dog was born in 2010")を期待する と、正規表現が役立ちますが、モジュールで何が起こっているのかを完全には理解していません。正規表現がどのように役立つか説明できますか?["bill","born"]"bill's"

4

5 に答える 5

2

あなたの要件は少し矛盾しているので、参考としてあなたの例を使用します。

In [27]: import re

In [28]: s = "Bill's dog was born in 2010"

In [29]: [w.lower() for w in re.findall(r'\b[A-Za-z]{4,}\b', s)]
Out[29]: ['bill', 'born']

正規表現を見てみましょうr'\b[A-Za-z]{4,}\b'

r'...'正規表現の一部ではありません。これはraw stringと呼ばれる Python 構造です。\b通常の意味を持たないバックスラッシュ シーケンスを除いて、通常の文字列リテラルのようなものです。

この 2 つは、単語の境界(つまり\b、単語の開始または終了) を探します。

[A-Za-z]{4,}、4 文字以上のシーケンスを探します。は文字クラス[A-Za-z]と呼ばれ、からまでの文字で構成されます。は、文字クラスが少なくとも 4 回一致する必要がある繰り返し演算子です。AZaz{4,}

最後に、リスト内包[w.lower() for w in ...]表記 は単語を小文字に変換します。

于 2013-03-04T18:50:34.863 に答える
1

はい、正規表現は、目的を達成するための最も簡単で簡単な方法です。

この正規表現を試してください:

matches = re.findall(ur"\b[a-zA-Z]{4,}\b", "Put Your String Here") #matches [Your,String,Here]
于 2013-03-04T18:51:40.300 に答える
0

そのようなすべての単語ではなく、4 文字以上の最初の単語を返します。代わりに追加しsentenceて返します:

def my_function(s):
    sentence = []
    for word in s.split():
        if len(word) >=4:
           sentence.append(word.lower())
    return sentence

リスト内包表記でそれを簡素化できます。

def my_function(s):
    return [word.lower() for word in s.split() if len(word) >= 4]

はい、正規表現でもこれを行うことができますが、あなたの場合はやり過ぎかもしれません。

于 2013-03-04T18:50:25.503 に答える
0

「文」に長い単語を蓄積するのを忘れました;) 代わりに最初の単語を返しています

于 2013-03-04T18:54:14.050 に答える
0

re.split の使用

>>> import re
>>> a='Hi, how are you today?'
>>> [x for x in re.split('[^a-z]', a.lower()) if len(x)>=4]
['today']
>>> 
于 2013-03-04T21:31:48.957 に答える