2017-11-11 4 views
3

例:私はこれを行う場合はデリミタではなく正のルックアヘッドとポジティブなルックバックがある場合、どのように文字列を分割しますか?

["Thisis", "sometext andthisis", "sometext"] 

s = "Thisissometext andthisissometext" 

私が "ある" と "一部" との間でテキストを分割したい

re.split("(?<=is)s(?=ome)", s) 
--> ['Thisis', 'ometext andthisis', 'ometext'] 

なし 'S'

これを行うと

re.split("(?<=is)(s)(?=ome)", s) 
--> ['Thisis', 's', 'ometext andthisis', 's', 'ometext'] 

私は何の区切りがない場合は、文字列を分割することができますどのようにこの

re.split("(?<=is)(?=some)", s) 
--> ValueError: split() requires a non-empty pattern match. 

をすれば?あなたは空の分割サポートするregex module新しい必要

答えて

3

import regex as re 

s = "Thisissometext andthisissometext" 

print(re.split(r"(?V1)(?<=is)(?=some)", s)) 
# ['Thisis', 'sometext andthisis', 'sometext'] 

は、新しい行動を可能にする、ここで(?V1)に注意してください。これは、同様にフラグを介して設定することができます。

print(re.split(r"(?<=is)(?=some)", s, flags = re.VERSION1)) 
+2

Hoi Jan、Great solution! 「聞いたことがない」(?V1) 'うわー。 – Reman

+2

@Reman:喜んで助けてください。答えの一番下に別の選択肢を提示しました。 – Jan

1

代わりsplitを使用するのではなく、ここにあなたがあなたの仕事を得るためにre.findallで使用できる正規表現です:

>>> s = "Thisissometext andthisissometext" 
>>> print re.findall(r'[\w\s]+?(?:is(?=some)|$)', s) 
['Thisis', 'sometext andthisis', 'sometext'] 

RegEx Demo

RegEx Breakup:

  • [\w\s]+?:マッチ1+単語や空白文字(非欲張り
  • (?::非キャプチャグループを起動
    • is:一致リテラルis
    • (?=some):それはsome
    • が続かなければなりません
    • |:OR
    • $:文字列の最後です。
  • ):エンド非キャプチャグループ
2

あなたは'@'ここにテキスト内の非既存の文字、知っていれば動作しますシンプルかつ迅速なアプローチ、:

s.replace('issome','[email protected]').split('@') 
# ['Thisis', 'sometext andthisis', 'sometext'] 

テストを:

In [300]: %timeit s.replace('issome','[email protected]').split('@') 
976 ns ± 21.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 

In [301]: %timeit regex.split(r"(?V1)(?<=is)(?=some)", s) 
7.36 µs ± 145 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 

In [302]: %timeit re.findall(r'[\w\s]+?(?:is(?=some)|$)', s) 
4.28 µs ± 97.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 
+0

あなたのソリューションをありがとう。非常に良いが、時には私の文字列を分割する正規表現が必要です。 – Reman

+0

もうひとつのタイムスリップ! – Jan

関連する問題