我需要一个python正则表达式,它将匹配字符串中所有(非空)单词序列,假设word是非空白字符的任意非空序列。
可以这样工作的东西:
s = "ab cd efg"
re.findall(..., s)
# ['ab', 'cd', 'efg', 'ab cd', 'cd efg', 'ab cd efg']
我最接近的是使用regex
模块,但仍然不我想要的内容:
regex.findall(r"\b\S.+\b", s, overlapped=True)
# ['ab cd efg', 'cd efg', 'efg']
另外,为了清楚起见,我不希望'ab efg'
在那里。
答案 0 :(得分: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']
答案 1 :(得分:0)
您可以做的是匹配所有字符串及其空格,然后将连续的切片连接在一起。 (这类似于Maxim的方法,虽然我确实独立开发了这个,但这保留了空白)
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))
首先找到匹配单词后跟任意数量空格的所有\S+\s*
,然后获取所有连续切片,连接它们,并从右侧删除空格。
如果空白始终是一个空格,只需使用Maxim的方法;它更简单,更快,但不保留空白。
答案 2 :(得分: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']
>>>