2017-04-15 19 views
0

正規表現の使い方を学んでいますが、質問があります。のは、私はlineは大文字(それがないもちろんこれは、)で始まり、少なくとも二つの単語を持っているかどうかを確認したい文字列正規表現 - 文字列内の大文字を見つける

line = 'Cow Apple think Woof` 

を持っているとしましょう。 Pythonでは、私は以下を実行しようとしました

import re 
test = re.search(r'(\b[A-Z]([a-z])*\b){2,}',line) 
print(bool(test)) 

しかし、それはFalseを出力します。私が代わりに

test = re.search(r'(\b[A-Z]([a-z])*\b)',line) 

をすれば、私はprint(test.group(1))Cowですがprint(test.group(2))w、最初のマッチ(test.groupであり、他の要素が存在しない)の最後の文字であることがわかります。

この問題を特定する上で、また問題の一般的な解決方法を教えてください。

答えて

1

中かっこのため、マッチの最後の文字がグループに含まれています。それらをドロップすると、あなたは大丈夫でしょう。

>>> t = re.findall('([A-Z][a-z]+)', line) 
>>> t 
['Cow', 'Apple', 'Woof'] 
>>> t = re.findall('([A-Z]([a-z])+)', line) 
>>> t 
[('Cow', 'w'), ('Apple', 'e'), ('Woof', 'f')] 

もちろん、大文字の単語の数はlen(t)です。

+0

ありがとうございます。そうですね、あの括弧はまったく必要ありませんでした! – Argon

+1

さらに、括弧は必要ありません。 're.findall(r '\ b [A-Z] [a-z] + \ b'、line)'あなたが必要なのはすべてです。 –

1

findall関数を使用して、正規表現に一致するすべてのインスタンスを検索します。 lenを使用して一致数を確認します。この場合、3が出力されます。長さが2より大きいかどうかを確認して、TrueまたはFalseを返します。

import re 

line = 'Cow Apple think Woof' 

test = re.findall(r'(\b[A-Z]([a-z])*\b)',line) 
print(len(test) >= 2) 

正規表現のみを使用する場合は、大文字の単語とその間のいくつかの文字と別の大文字の単語を検索できます。

test = re.search(r'(\b[A-Z][a-z]*\b)(.*)(\b[A-Z][a-z]*\b)',line) 
print(bool(test)) 
  • (\b[A-Z][a-z]*\b)は - 0個以上の文字
  • (\b[A-Z][a-z]*\b)
  • と一致する - - 大文字ワード
  • (.*)発見発見第大文字ワードを

この方法は、それ以来、動的としてありません3大文字の単語と一致させるためには機能しません。

+1

@Argon、純粋な正規表現のソリューションを追加しましたが、それが良いかどうかはわかりません – davidhu2000

関連する問題