1

私はデータを扱っています...

*マーク プロパティ A
**マーク プロパティ B
***マーク プロパティ A & B

text1 = "spam*eggs"   # A
text2 = "eggs**spam"  # B
text3 = "spam***spam" # A & B

プロパティ B のテストは簡単です。

"**" in <string>

しかし、同じ戦略でプロパティ A をテストすると、text2 で誤検出が発生します。

>>> "*" in text2
True

プロパティ A をテストしたいのですが、正規表現を使用せずにこれを行う Pythonic な方法はありますか? 正規表現に慣れていない初心者プログラマーとコードを共有しているため、正規表現を使用したくありません。

4

5 に答える 5

2

これを試して:

idx = txt.index('*')
if txt[idx+1] != '*':
    print 'A'
elif txt[idx+2] != '*':
    print 'B'
else:
    print 'A & B'

上記は、たとえば、文字列が存在しない場合、または文字列が最後の文字である場合など、コーナーケースの例外を発生させます。このソリューションには、テキストの1 回のトラバーサル ( への呼び出しindex()) を実行するという追加の利点があります。

于 2013-10-21T15:41:27.043 に答える
0

まあ、私はそれがPythonicだとは言いませんが、それらをグループ化して、連続した出現が特定の長さであることを確認できます-**たとえば、除外する1または3のいずれかです。

from itertools import groupby
print any(k=='*' and len(list(g)) in (1, 3) for k, g in groupby(s))
于 2013-10-21T16:07:10.267 に答える
-1

テキストのようにプロパティ A だけをテストしたいのか、タイトルのように A または C をテストしたいのか明確ではありません。(C は A と B)

True2 ではなく 1 または 3 のorを取得するFalseには、ロジックを書き換えたコードを使用できます。

result = '***' in x or (not  '**' in x and '*' in x)

ABCパターンに応じてレター オブ アウトを取得するには:

result = ['None','A','B','C'][('*' in x) + ('**' in x) + ('***' in x)]

プロパティ A (星 1 つ) をテストするだけで、2 つまたは 3 つに失敗することはありません。(編集:これを単純化しました。**そこにない場合は、どちらもありません***):

isItA = '*' in x and not  '**' in x
于 2013-10-21T18:31:23.823 に答える