2017-01-29 3 views
0

は私がtxtFreeFormと呼ばれる文字列のリストを持っています。私はこのマッチユニークなパターンのPython

for each_line in txtFreeForm: 
    match = re.search('add roth',each_line.lower()) 
    if match is not None: 
     print(each_line) 

を使用しかし、両方が「ロスを追加」を含む、これは明らかに私のリストに両方の文字列を返すことができません。私は文字列で検索するためにこれらのパターンの束を持っているので、排他的に 'roth'を検索する方法がありますか?

ありがとうございました!

+3

"Add roth"が両方とも含まれていると、2つの文字列が返されないのはなぜですか? –

+1

'each_line.lower():...'に 'add roth'を追加すると、この問題を解決するのにもっと安い方法です。 're'は必要ありません。 – DyZ

+0

私は 'in'はそれを行うより安価な方法であることに同意します。 @AndreiSavin私はテキストで見つかった場合、それが両方返されることを知っています。 'rothを追加する'と '計画を追加する'を含む文を区別する方法を探しています –

答えて

0

文字列の.Lengthプロパティを使用してこの問題を修正できますか?私は経験豊富なPythonプログラマないんだけど、ここで私はどのように考えるか、それが動作するはずさ:

for each_line in txtFreeForm: 
    match = re.search('add roth',each_line.lower()) 
    if (match is not None) and (len(txtFreeForm) == len("Add Roth")): 
     print(each_line) 

基本的には、テキストが文字列である場合、文字列の長さは、文字列の長さに正確です"Add Roth"を選択すると、 "Add Roth"だけが含まれている必要があります。

これは役に立ちましたと思います。

編集:私はあなたが求めていたものを誤解

。あなたは "Add Roth"を含む文章を印刷したいが、 "Add Roth in plan"を含む文章は印刷したくない。これは正しいです?

このコードはどうですか?

for each_line in txtFreeForm: 
    match_AR = re.search('add roth',each_line.lower()) 
    match_ARIP = re.search('add roth in plan',each_line.lower()) 
    if (match_AR is True) and (match_ARIP is None): 
     print(each_line) 

これは問題を修正する必要があるようです。任意の文字列(「計画中」など)を検索して比較に追加することで除外できます。

+0

次に、 'each_line.lower()== 'roth''を直接追加してみませんか? –

+0

@Michael Kempあなたのコードはリストから両方の文字列を再度返します –

+0

@AndreiSavinあなたが示唆しているのは完全一致です。文の一部であるrothを追加しないでください。 –

0

あなたは近いです:)これに打撃与える:ああ、私はあなたがこれらの多くを持っている...読み違え :

for each_line in txtFreeForm: 
    match = re.search('add roth (?!in[-]plan)',each_line.lower()) 
    if match is not None: 
     print(each_line[match.end():]) 

EDITを。これはもっと積極的な魔法を必要とします。

import re 
from functools import partial 

txtFreeForm = ['Add roth Sweep non vested money after 5 years of termination', 
       'Add roth in-plan to the 401k plan.'] 


def roths(rows): 
    for row in rows: 
     match = re.search('add roth\s*', row.lower()) 
     if match: 
      yield row, row[match.end():] 

def filter_pattern(pattern): 
    return partial(lazy_filter_out, pattern) 


def lazy_filter(pattern): 
    return partial(lazy_filter, pattern) 


def lazy_filter_out(pattern, rows): 
    for row, rest in rows: 
     if not re.match(pattern, rest): 
      yield row, rest 

def magical_transducer(bad_words, nice_rows): 
    magical_sentences = reduce(lambda x, y: y(x), [roths] + map(filter_pattern, bad_words), nice_rows) 
    for row, _ in magical_sentences: 
     yield row 

def main(): 
    magic = magical_transducer(['in[-]plan'], txtFreeForm) 
    print(list(magic)) 

if __name__ == '__main__': 
    main() 

何が起こっているのかを少し説明するために、あなたはこれらの言葉の多くを処理すると述べました。 2つの項目のグループを比較する従来の方法は、ネストされたforループです。したがって、「よりフラットな」実装を実現し、ネストされたループを回避するために、いくつかの異なるテクニックを使用しています。私はそれらを説明するために全力を尽くします。

**Function compositions** 
# You will often see patterns that look like this: 
x = foo(a) 
y = bar(b) 
z = baz(y) 

# You may also see patterns that look like this: 
z = baz(bar(foo(a))) 

# an alternative way to do this is to use a functional composition 
# the technique works like this: 
z = reduce(lambda x, y: y(x), [foo, bar, baz], a) 
+0

うわー。私は機能を理解していない。読書をしてからあなたに戻ってください。事前に感謝 –

+0

ああ、うわあ、それについて申し訳ありません!私は私のポストではっきりしていたはずです。私はこれが何をしているかについていくつか余分なことができるかどうかを見ていきます。 –

関連する問題