2016-11-15 95 views
1

我很抱歉如果这已被回答以前 - 我不完全知道如何解释/搜索这个,所以我找不到任何存在的东西。Python - 字符替换的迭代

我正在浏览一大串字符串,并试图在另一个数据集中查找匹配项。输入数据集以空格分隔,现有数据集使用不一致的下划线和驼峰组合。

我正在寻找一种干净的方式来遍历这些组合的所有可能性。 最简单的情况是这样的:

输入:“变型”

所需的输出:“Variant_Type”,“不定型别”

我一直在通过搜索两次完成这2个字的情况:

x = input.replace(' ','_') 
# Search 
x = x.replace('_','') 
# Search again 

但现在,我意识到有很多像长字符串:

输入:“时间轴集成启用”

所需的输出:

“Timeline_Integration_Enabled”, “TimelineIntegration_Enabled”, “Timeline_IntegrationEnabled”, “TimelineIntegrationEnabled”

有一个聪明的,Python化的方式来做到这一点?

注意:我知道我可以使用类似difflib.get_close_matches()的东西,但是我希望将它作为数据的最后一遍,提示用户在任何不清楚的字段上做出决定。

在此先感谢,并让我知道你是否需要任何更多细节。

+0

这是您实现它的最好也是最简单的方法。 – Inconnu

+0

如果用户输入“启用时间轴集成”,怎么可能?将它改为大写的第一个字母,然后追加或像“Timeline_integration_enabled”? – bzimor

回答

3
def iterate_replacements(input_data): 
    if " " in input_data: 
     yield from iterate_replacements(input_data.replace(" ", "", 1)) 
     yield from iterate_replacements(input_data.replace(" ", "_", 1)) 
    else: 
     yield input_data 

for s in iterate_replacements("Timeline Integration Enabled"): 
    print(s) 

或者2.7,不支持yield from

def iterate_replacements(input_data): 
    if " " in input_data: 
     for x in iterate_replacements(input_data.replace(" ", "", 1)): yield x 
     for x in iterate_replacements(input_data.replace(" ", "_", 1)): yield x 
    else: 
     yield input_data 

for s in iterate_replacements("Timeline Integration Enabled"): 
    print(s) 

结果:

TimelineIntegrationEnabled 
TimelineIntegration_Enabled 
Timeline_IntegrationEnabled 
Timeline_Integration_Enabled 
0

这是另一种可以将字符串连接在一起的方法,虽然你做的方式很简单。使用Django的slugify。

from django.template.defaultfilters import slugify 
print(slugify("Variant Type")) 
0

所以,如果我理解正确的话,你只是想删除下划线和空间。

如果你得到了Timeline_Integration的匹配,你也会得到TimelineIntegration的匹配,所以我有点困惑,为什么你想要用'_'或''来替换空格。

例如:搜索“时间轴集成方法”:

搜索“Timeline_Integration”:

为什么不直接替换_中的搜索以及搜索到的文本输入的字符串。这保持一致性。或者,如果您想区分大小写,请将'_'替换为''。

除非我完全误解了目标,我相信一个可能的解决方案是只完全去除第一搜索和做这样的事情:

解决方案:

空间不敏感

SEARCH_STRING = ''.join([x for search_string,if x!=''and x!='_']) to_be_searched_string =''.join([x for_be_searched_string if x!=''and x!= '_'])

s对步调敏感

search_string =''.join([x for search_string中的x如果x!=''else'_']) to_be_searched_string =''.join([x for_be_searched_string if x!=' 'else'_'])