2016-08-27 2 views
3

に期待得ることはありません、私は次のことを書いたが、それはそうではない多くの単語を含んでいます平等、舞踊、攻撃的、執行のような上記の基準を満たしています。なぜこれが起こっていますか?は私がAZまたはPTの文字列が含まれているか、IZE</p> <p>で終わるのいずれかのことをtext6内の単語を探していますどのような正規表現の式

L2=[w for w in text6 if re.search(r".*[z]|.*[p][t]|[ize]$",w) 

もう一つの問題前の練習に構築:私は言葉が1のみ1大文字で始まり、すなわちという新しい代替条件を追加する必要があります。

私は、それはまた、大文字の単語(大文字でのすなわちすべての文字)

でしたこれらの2つの質問でいずれかのヘルプが含まれ

L2=[w for w in text6 if re.search(r"[A-Z]{1}|.*[z]|.*[p][t]|[ize]$",w) 

を書きましたの?

は、事前にあなたがあなたのテキストを分割する必要があり、その場合のために、文字ではない言葉を反復している

マウロ

+1

最初のケースでは、 'ize $'は必要ですか?このパターンが含まれている単語は、 'z 'だけでもキャプチャされますか? – Psidom

答えて

2

、ありがとうございました。

また、あなたは、正規表現なしに、これらのジョブのすべての操作を実行できます。

from string import ascii_uppercase 

def check_word(word): 
    return 'z' in word or 'pt' in word or word.endswith('ize') or word.startswith(tuple(ascii_uppercase)) 

[w for w in text6.split() if check_word(w)] 

デモ:最後の条件については

>>> text6 = "here are some example: appease dance offensive xxxize executive and other extra words optimum Python" 
>>> [w for w in text6.split() if check_word(w)] 
['xxxize', 'optimum', 'Python'] 

単語が1で始まり、1つだけ大文字)の場合あなたが追加することができる最初のもの(word[1:].islower())をcheck_wordに置き換えて、大文字を単語に入れたくない場合:

def check_word(word): 
    return 'z' in word or 'pt' in word or word.endswith('ize') or (word.startswith(tuple(ascii_uppercase)) and word[1:].islower()) 

:あなたは別の条件で複数の区切り文字で単語を区切ったりベースにしたい場合は、単語を見つけるためにre.findall()を使用することができます。

たとえば、次の正規表現は、単語は単語文字が含まれている風になる:あなたが探しているものを

re.findall(r'\b\w+\b', my_str) 
1

は次のとおりです。

[w for w in text6 if re.search(r"z|pt|ize$", w)] 

これは、必要なすべての単語をキャプチャします。 ize$と一致する単語もzと一致するため、最後の部分は必須ではありません。第二の場合は、式^[A-Z]{1}[^A-Z]を使用することによって解決することができる

[w for w in text6 if re.search(r"z|pt", w)] 

:だから、本質的に、発現は、に帰着します。

[w for w in text6 if re.search(r"^[A-Z]{1}[^A-Z]|z|pt|ize$", w)] 

それとも、単に、

:それは、正確に一つの大文字
  • がこれを以下で使用される大文字
  • が続かないと

    • 開始します
      [w for w in text6 if re.search(r"^[A-Z]{1}[^A-Z]|z|pt", w)] 
      
    +0

    これは 'text6'が単語の' list'であると仮定しています。そうでない場合は、@ Kasramvdによって指摘されているように、代わりに 'text6.split()'のループを実行してください – agamagarwal

    2

    私はsugges正規表現はこのユースケースの要求よりも複雑に思えるので、ここでは正規表現ではないアプローチです。

    ize」で終わる制約を取り除くことができます。その中には、zという単語が含まれています。上記ケースを一致させるための

    [w for w in text6 if 'pt' in w or 'z' in w] # ['inept', 'zoo', 'Inept', 'INept'] 
    

    ならびにのみ大文字の単語:小文字pt又はzとちょうど一致する単語を

    text6 = [ 
        'appease', 'dance', 'offensive', 'executive', 
        'inept', 'zoo', 'Inept', 'Zoo', 'INept', 'ZOo'] 
    

    もちろん

    [w for w in text6 if w.istitle() and ('pt' in w or 'z' in w)] # ['Inept'] 
    

    、それは良いかもしれこのロジックを抽象化する関数を書く:

    def meets_criteria(word): 
        return word.istitle() and ('pt' in word or 'z' in word) 
    
    [w for w in text6 if meets_criteria(w)] 
    

    ZPtで始まる単語も一致させる場合は、代わりにw.lower()のメンバーシップをチェックすることができます。

    関連する問題