如何分割字符串并将其子字符串与子字符串列表匹配? - Python
我需要把一个字符串分割成所有可能的方式,而且不能改变字符的顺序。我知道这个任务可以看作是自然语言处理中的标记化或词形还原,但我想从纯字符串搜索的角度来做,这样更简单也更稳妥。 给定:
dictionary = ['train','station', 'fire', 'a','trainer','in']
str1 = "firetrainstation"
任务 1:我该如何生成所有可能的子字符串,以便得到:
all_possible_substrings = [['f','iretrainstation'],
['fo','retrainstation'], ...
['firetrainstatio','n'],
['f','i','retrainstation'], ... , ...
['fire','train','station'], ... , ...
['fire','tr','a','instation'], ... , ...
['fire','tr','a','in','station'], ... , ...
['f','i','r','e','t','r','a','i','n','s','t','a','t','i','o','n']
任务 2:然后从 all_possible_substring
中,我该如何检查,看看哪个子字符串集合包含字典中的所有元素,这样才能说这是正确的输出。期望的输出是一个子字符串的列表,这些子字符串来自字典,并且从左到右匹配的字符数量最多。期望的输出是:
"".join(desire_substring_list) == str1 and \
[i for i desire_substring_list if in dictionary] == len(desire_substring_list)
#(let's assume, the above condition can be true for any input string since my english
#language dictionary is very big and all my strings are human language
#just written without spaces)
期望的输出:
'fire','train','station'
我做了什么?
对于任务 1,我做了这个,但我知道这不会给我所有可能的空格插入:
all_possible_substrings.append(" ".join(str1))
我做了这个,但这只完成了任务 2:
import re
seed = ['train','station', 'fire', 'a','trainer','in']
str1 = "firetrainstation"
all_possible_string = [['f','iretrainstation'],
['fo','retrainstation'],
['firetrainstatio','n'],
['f','i','retrainstation'],
['fire','train','station'],
['fire','tr','a','instation'],
['fire','tr','a','in','station'],
['f','i','r','e','t','r','a','i','n','s','t','a','t','i','o','n']]
pattern = re.compile(r'\b(?:' + '|'.join(re.escape(s) for s in seed) + r')\b')
highest_match = ""
for i in all_possible_string:
x = pattern.findall(" ".join(i))
if "".join(x) == str1 and len([i for i in x if i in seed]) == len(x):
print " ".join(x)
1 个回答
3
对于第一部分,你可以写一个递归生成器,类似于这个:
>>> def all_substr(string):
for i in range(len(string)):
if i == len(string) - 1:
yield string
first_part = string[0:i+1]
second_part = string[i+1:]
for j in all_substr(second_part):
yield ','.join([first_part, j])
>>> for x in all_substr('apple'):
print(x)
a,p,p,l,e
a,p,p,le
a,p,pl,e
a,p,ple
a,pp,l,e
a,pp,le
a,ppl,e
a,pple
ap,p,l,e
ap,p,le
ap,pl,e
ap,ple
app,l,e
app,le
appl,e
apple