2017-09-25 12 views
-1

正規表現を使用していくつかの文字列を一致させようとしています。私が検索したいのは、誰かの子供について語る文字列です。たとえば、同じように:私の息子は、など正規表現を使用して文字列内のさまざまなフレーズを一致させます。

私の娘、私たちの娘は、だから私はPythonでこれを書いている:

re.match(r'\b(my|our)\b \b(son|daughter|children|child|kid)s?', 'me and my son were') 

しかし、それはテスト文にmy sonと一致していないか、いくつかを。戻り値None

私はこの正規表現をここでテストしました:https://regex101.com/r/ChAy9e/1そしてそれはうまくいきます(テストケースでは5行目)。

私が間違っていることを理解できません。

ありがとうございます!

+0

私は質問が重複しているとは思いません。このコンセプトは既に早期に回答されているかもしれませんが、私はその違いを理解していないため、問題を自分で解決できませんでした。私がすでに違いを知っていれば、この質問は、元の質問は現れません。全体的な目的は、あなたがどこかでつかまったときに助けることです? – SureshS

答えて

2

matchは、文字列の先頭でのみ正規表現と一致します。あなたは使用する必要がありますfindall方法

>>> re.findall(r'\b(my|our)\b \b(son|daughter|children|child|kid)s?', 'me and my son were') 
[('my', 'son')] 

試合 は一致が見つからなかった場合 マッチオブジェクト、またはNoneを返し、文字列の開始でパターンを適用するようにしてください。

+0

偉大な、それは働いた!ありがとう。 'match'と' findall'のドキュメントをもう一度読みます。 – SureshS

+0

@SureshS私は助けることができてうれしい。あなたが私の答えが有用であることを発見した場合、親切にupvoting&受け入れ、感謝を考慮してください:) – Vinny

1

ビニーは言ったように、re.findallが必要です。しかし、これらのフレーズを1つの要素として欲しければ、正規表現を少し修正したいと思うでしょう。試してみてください:

キャプチャグループを削除すると、一度に1つのフレーズをキャプチャできます。私はまたchildrenschilds(それは誤った文法です!)を探す必要がないので、あなたの正規表現を少し最適化しました。

詳細

\b   # word boundary 
(?:   # open non-capture group 
    my   
    |   # 'or' operation 
    our   
) 
\s+   # whitespace - one or more 
(?:   # open non-capture group 
    son   
    | 
    daughter 
    | 
    kid 
) 
s?   # 's' optional   
| 
children 
| 
child 
\b   # word boundary 
関連する問題