0

シナリオ:

リストがあります:

['item','place','thing']

そして、私はいくつかの文字列を持っています:

"item", "item1", "thing55", "place_C", "stuff", "junk5"

上記のうち、最初の 4 つが一致し、最後の 2 つが一致しないようにします。このチェックには、startswith 関数が最適です。

(テスト文字列 "item"、"item1" などのリストは Python リストではありません。これは、チェックされるサンプル データのセットにすぎません。ただし、"item"、"place" と照合する文字列のリストは、 、「もの」はコード内の python リストです。)

最初のリストを反復処理して、文字列を startswith と比較できます。

successVar = False
for s in myStrings:
    if (testString.startswith(s)): 
        successVar = True
        break
#  Now you would check successVar to decide if string matched

しかし、これは必ずしもすべてのケースで最適に機能するとは限りません。たとえば、これが if/elif 構造の一部であるとします。

if (testString == "hello"):
    # do something based on exact string match
elif (testString.endswith("!")):
    # do something if string ends with _one_ specific entity
elif <somehow, do the above comparison in here>
    # do something if string starts with any of the items in a list
else:
    # do something if string didn't match anything

チェック全体を関数内にラップすることもできると思いますが、インライン コードでこれをより簡単に、またはより簡潔に行う方法があるように感じます。

これは、関数を作成せずに行うことさえ可能ですか?

ありがとう

4

4 に答える 4

10

str.startswith()接頭辞のタプルを受け入れます:

>>> "item1".startswith(("item","place","thing"))
True
于 2013-09-11T17:10:29.823 に答える
1

さまざまな種類のテストに正規表現を使用できます。正規表現を「で始まる」、「で終わる」、「完全に一致する」、または「含む」にするのは簡単です。大文字と小文字を区別しないように指定することもできます。辞書を使用して、実行する各アクション (関数である必要があります) に正規表現を関連付けることができます。

import re

def handle_item(text):
    print "handling item", text

def handle_place(text):
    print "handling place", text

def handle_thing(text):
    print "handling thing", text

match_dict = {"!$":          handle_thing,    # ends with !
              "(?i)^hello$": handle_place,    # case-insensitive exact match for hello
              "^@":          handle_item,     # begins with @
             }

test_string = raw_input("Enter a string to test: ")

for regex in match_dict:
    if re.search(test_string, regex):
        match_dict[regex](test_string)        # call function
        break

テストを特定の順序で実行する必要がある場合は、 a を使用しcollections.OrderedDictてそれ (またはタプルのリスト) を指定できます。また、現在、一致が 1 つ見つかるとテストが停止します。複数のテストが一致する可能性があり、それらすべてを処理したい場合は、break.

もちろん、これは 1 つのアイテムを処理するだけです...これを関数に入れて各アイテムに対して呼び出し、アイテムの分割を独自の関数に入れます。

于 2013-09-11T17:19:19.250 に答える
0

文字列を分割するために使用できます。次に、 to をcsv渡すだけです。tuplestr.startswith

import csv

check = ['item','place','thing']
items = '"item", "item1", "thing55", "place_C", "stuff", "junk5"'
match = [el for el in next(csv.reader([items], skipinitialspace=True)) if el.startswith(tuple(check))]
# ['item', 'item1', 'thing55', 'place_C']
于 2013-09-11T17:14:34.560 に答える
0

次のように、許可されたプレフィックスのリストを で区切って文字列に結合します|

pattern = "|".join(['item','place','thing'])

次に使用しますre.match()

strs = ["item", "item1", "thing55", "place_C", "stuff", "junk5"]
matching_strs = [s for s in strs if re.match(pattern, s)]

これにより、次が生成されます。

matching_strs
=> ['item', 'item1', 'thing55', 'place_C']

strsこれは、任意の文字列を1 回だけ調べて、一度に 1 つずつではなく、許可されているすべてのプレフィックスと比較するため、提案されている他の方法よりも高速である必要があります。

re.compileonを使用すると、さらに高速化できますpattern

警告: この単純なケースは、許可された接頭辞に 、、などの「特殊な」文字が (あるre意味で)含まれていない場合にのみ機能します。|.(|

于 2013-09-11T18:02:11.070 に答える