2013-02-19 9 views
8

私はパスのリストでファイルを解析しています。あるパスが特定のディレクトリの下にあるかどうかを確認しようとしています。だから私は2つの弦S1とS2を持っています。 S1 = '/ tmp /'、S2 = '/tmp/file.txt'pythonのstrncmp

S2がS1であるかどうか、そしてCで余分なバイトがあるかどうかを確認するには、strncmp S1とS2のstrlen(S1)バイトまでです。 Pythonでこれを行う方法はありますか?私はPythonには新しく、まだ利用可能なモジュールをすべて知っているわけではありません。文字列の文字を比較して比較するだけでこれを簡単に実装できますが、デフォルトでこれらのヘルパー機能を私に与えるものがあるかどうか調べたい場合

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

p

答えて

11

はい。あなたはできる:if a in b:それはaが部分文字列であるかどうかを確認するだろうb

if 'foo' in 'foobar': 
    print True 

if 'foo' in 'barfoo': 
    print True 

あなたの投稿からは、文字列の先頭だけを見たいと思われます。

if 'foobar'.startswith('foo'): 
    print "it does!" 

同様に、あなたはendswithと同じことを行うことができます:

if 'foobar'.endswith('bar'): 
    print "Yes sir :)" 

最後に、多分strncmpのほとんど直訳はスライスを使用することですその場合、あなたは.startswithメソッドを使用することができますそして==

if a[:n] == b[:n]: 
    print 'strncmp success!' 

Pythonはまた、0123にパス名を扱うための多くの施設を持っていますモジュール。そこにあるものを調べる価値があります。いくつかのきれいな機能があります。

+0

ユアーズは、おそらくよりニシキヘビですが、私はスライシングも考慮すべきだと思います。 +1 – 0xC0000022L

+1

うわー。これはちょうど私がPythonが望んでいるもののようなものです。私はPythonが素晴らしいと言われ、これまでのところ失望していません。 – R11

+0

@ R11 - pythonには、最初からほとんどの人を動かすようないくつかの質問がありますが、それらを見つけたら、本当にうれしいです。がんばろう! – mgilson

2

あなたはおそらくos.path.commonprefixを探しています。例えば

os.path.commonprefix(['/tmp/','/tmp/file.txt'])'/tmp/

を返しますので、あなたはlen(os.path.commonprefix([s1,s2])) > 0

をチェックする必要があり、ここでドキュメントをチェックアウト:http://docs.python.org/2/library/os.path.html

+0

これは興味深い問題です。箱の外で考えてみると+1。 – mgilson

+0

ニース!私はこれも本当に好きです。また、 "/ tmp /"ではなく "C:\\ tmp \"で始まるウィンドウパスのようなOS固有の表記法も扱いますか?私が投稿したときに私は中途半端にこれを持っていなかった。私はちょうどいくつかの文字列のマニュキュレーショントリックを見つけることを望んでいた。しかし、素晴らしい! – R11

+0

正直言って、私はそれがどのようにウィンドウで動作するのかわかりませんし、自分自身をチェックするウィンドウボックスはありませんが、私はそれを推測しません。パスがサブパスであるかどうかをチェックするより正確な方法のように見えます。私はちょうどCが特殊なモジュールを持っていないかもしれないパス操作をしていたことに気づきましたが、Pythonは 'os.path'を持っています。多くのプログラマーは、他のバックグラウンドからPythonに来て、それらの関数を(通常は非ポータブルな方法で)再作成するので、標準ライブラリを紹介することが良い考えだったように感じました。覚えておいて、Pythonには以下の電池が付属しています:D – rgrinberg

0

を、あなたは、文字列

>>> s1 = "/tmp" 
>>> s2 = "/tmp/file.txt" 
>>> s2.find(s1) 
0 
1
find方法を使用することができます

これでテストできます

S2[:len(S1)] == S1 

またはさらに簡単:

S2.startswith(S1)