2012-03-16 10 views
6

最も簡単な方法は、一例である分割パターン文字を保持します: 私はこの文字列を持っている:私は2つの異なる方法を分割する方法を知っている「ドキュメント/ SRC /スクリプト/ TEMP」 :Pythonの正規表現の分割は、これを説明する

re.split('/', 'Docs/src/Scripts/temp') -> ['Docs', 'src', 'Scripts', 'temp'] 

re.split('(/)', 'Docs/src/Scripts/temp') -> ['Docs', '/', 'src', '/', 'Scripts', '/', 'temp'] 

フォワードスラッシュで分割する方法はありますか?単語のスラッシュ部分は保持しますか? は例えば、私はこのように見て上記の文字列をしたい:

['Docs/', '/src/', '/Scripts/', '/temp'] 

任意の助けをいただければ幸いです!

+0

それは 're.splitです( '(/)'、...)'ではなく ' re.split(( ''/')、...) '。 –

答えて

8

興味深い質問は、私はこのような何かをやってお勧めします:

>>> 'Docs/src/Scripts/temp'.replace('/', '/\x00/').split('\x00') 
['Docs/', '/src/', '/Scripts/', '/temp'] 

ここでの考え方は、まず、元の一部ではないでしょう特殊文字で区切られた2つの/文字ですべて/文字を置換することです文字列。 nullバイト('\x00')を使用しましたが、これを別のものに変更してから、最後にその特殊文字に分割することができます。

長さがゼロのマッチで分割できないため、正規表現は実際にはあまり効果がありません。また、re.findall()では重複するマッチが見つからないため、文字列に対して複数のパスを実行する必要があります。

また、re.split('/', s)s.split('/')と同じことを行いますが、2番目の方が効率的です。

+0

お返事ありがとうございます! – user1274774

+1

分割と結合は '' Docs/src/Scripts/temp'.replace( '/'、 '/ \ x00 /') 'のようになります。 –

+0

@gnibbler - 愚かな私、とても清潔です!その代わりに私の答えを編集しました。 –

1

これを行う簡単な方法はわかりません。これは私が思いつくことができる最高です...

import re 

lSplit = re.split('/', 'Docs/src/Scripts/temp') 
print [lSplit[0]+'/'] + ['/'+x+'/' for x in lSplit][1:-1] + ['/'+lSplit[len(lSplit)-1]] 

あなたが望むものは何ですか?

+0

とにかく1文字だけを分割するときに正規表現が必要なのはなぜですか? – hop

+0

あなたはしません。必要ならstr.split()を使うことができます。 F.Jの答えはとにかく私よりも優れています。 – b10hazard

3

1)あなたは、単一の固定文字に分割するために正規表現を必要としない:

>>> 'Docs/src/Scripts/temp'.split('/') 

[ 'ドキュメント'、 'SRC'、 'スクリプト'、 'TEMP']

2)この方法を使用することを検討してください:

import os.path 

def components(path): 
    start = 0 
    for end, c in enumerate(path): 
     if c == os.path.sep: 
      yield path[start:end+1] 
      start = end 
    yield path[start:] 

それは私の意見では、それははるかに読みやすくなり、スプリット参加分割、のような巧妙なトリックに依存しません。

2

あなたが両側にスラッシュを持つことを主張していない場合には、それは実際には非常に簡単です:それはあなたが本当に欲しいものですので、もし、

>>> re.findall(r"([^/]*/)", 'Docs/src/Scripts/temp') 
['Docs/', 'src/', 'Scripts/'] 

どちらreも分割が実際にオーバーラップした文字列のために切り出されるI最初のものを除くすべての結果の先頭にスラッシュを追加するだけです。split()無ししかし先読みと

5

溶液:

>>> s = 'Docs/src/Scripts/temp' 
>>> r = re.compile(r"(?=((?:^|/)[^/]*/?))") 
>>> r.findall(s) 
['Docs/', '/src/', '/Scripts/', '/temp'] 

を説明:

(?=  # Assert that it's possible to match... 
(  # and capture... 
    (?:^|/) # the start of the string or a slash 
    [^/]* # any number of non-slash characters 
    /?  # and (optionally) an ending slash. 
)   # End of capturing group 
)   # End of lookahead 

先読みアサーションは、文字列内のすべての位置で試行され、任意の文字を消費しないので、重複するマッチに問題はありません。

+0

ハ、私は楽しいためにこの質問を働いて、あなたのキャラクターのためのキャラクターと同じ正規表現で出てきました! (私はあなたが '*'を持っていた場所を除いて)+) – zx81

2

これについて試してみてください:によって

re.split(r'(/)', 'Docs/src/Scripts/temp') 

Pythonのドキュメントから

re.split(パターン、文字列、maxsplit個= 0、フラグ= 0)

スプリット文字列 パターンの出現。 パターンにキャプチャ括弧が使用されている場合は、 パターン内のすべてのグループのテキストも、結果リストの一部の として返されます。 maxsplitが0以外の場合、maxsplit分割数 が発生し、残りの文字列がリストの最後の 要素として返されます。 (非互換性ノートは:オリジナルのPython 1.5 リリースでは、maxsplit個は無視されましたこれは、以降のリリースで修正されました。)

+0

申し訳ありませんが、ちょっと混乱してください。 –