2017-09-26 17 views
4

wordが空白以外の任意の空白以外の文字列であると仮定して、文字列内のすべての(空でない)文字列と一致するPython正規表現が必要です。正規表現のすべての文字列を一致させる

このように動作します何か:

regex.findall(r"\b\S.+\b", s, overlapped=True) 
# ['ab cd efg', 'cd efg', 'efg'] 

また、ちょうど明確にする:私は、これは私が欲しいものではないまだregexモジュールを使用したが、になった

s = "ab cd efg" 
re.findall(..., s) 
# ['ab', 'cd', 'efg', 'ab cd', 'cd efg', 'ab cd efg'] 

最も近いです、I には'ab efg'が入ります。

+0

正規表現は貪欲なので任意の繰り返しの正規表現ではない 'sのない理由エンド – HyperNeutrino

+0

のすべての方法と一致しますので、あなたが' 'ABのcd''と一致することはできません。 split() 'あなたのニーズを満たしていますか? – wwii

答えて

4

ような何か:

matches = "ab cd efg".split() 
matches2 = [" ".join(matches[i:j]) 
      for i in range(len(matches)) 
      for j in range(i + 1, len(matches) + 1)] 
print(matches2) 

出力:

['ab', 'ab cd', 'ab cd efg', 'cd', 'cd efg', 'efg'] 
0

あなたは何ができるかは、文字列とその空白のすべてに一致して、一緒に連続したスライスを結合です。 (私は独立して、これを開発しましたけれども、これはマキシムのアプローチに似ていますが、これは空白を保持します)

import regex 
s = "ab cd efg" 
subs = regex.findall(r"\S+\s*", s) 
def combos(l): 
	out = [] 
	for i in range(len(subs)): 
		for j in range(i + 1, len(subs) + 1): 
			out.append("".join(subs[i:j]).strip()) 
	return out 
print(combos(subs)) 

Try it online!

この最初は空白の任意の量に続く単語に一致するすべての\S+\s*を見つけ、すべての連続したスライスを取得し、結合し、その右側の空白を削除します。

空白が常に1つのスペースである場合は、マキシムのアプローチを使用してください。それはより簡単で高速ですが、空白を保持しません。正規表現がなければ

0

import itertools 
def n_wise(iterable, n=2): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    iterables = itertools.tee(iterable, n) 
    for k, it in enumerate(iterables): 
     for _ in range(k): 
      next(it, None) 
    return zip(*iterables) 

def foo(s): 
    s = s.split() 
    for n in range(1, len(s)+1): 
     for thing in n_wise(s, n=n): 
      yield ' '.join(thing) 

s = "ab cd efg hj" 
result = [thing for thing in foo(s)] 
print(result) 

>>> 
['ab', 'cd', 'efg', 'hj', 'ab cd', 'cd efg', 'efg hj', 'ab cd efg', 'cd efg hj', 'ab cd efg hj'] 
>>> 
関連する問題