Python - 字符替换的迭代

时间:2016-11-15 17:12:00

标签: python string iteration

如果之前已经回答过,我道歉 - 我不完全确定如何解释/搜索这个,所以我找不到任何现有的东西。

我正在查看大量字符串并尝试在其他数据集中查找匹配项。输入数据集是空格分隔的,现有数据集使用下划线和驼峰大小写的不一致组合。

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

输入:"变体类型"

所需输出:" Variant_Type"," VariantType"

我通过搜索两次来完成这个2字的案例:

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

但是现在我意识到有很多更长的字符串,如:

输入:"启用时间轴集成"

期望的输出:

" Timeline_Integration_Enabled"," TimelineIntegration_Enabled"," Timeline_IntegrationEnabled"," TimelineIntegrationEnabled"

有没有聪明的Pythonic方法来实现这个目标?

注意:我知道我可以使用像difflib.get_close_matches()这样的东西,但我希望这样做是对数据的最后一次传递,促使用户对任何不清楚的字段做出决定。

提前致谢,如果您需要更多详细信息,请与我们联系。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这是另一种将字符串连接在一起的方法,尽管你的方式很简单。使用Django' s slugify。

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

答案 2 :(得分:0)

因此,如果我理解正确,您只是想删除下划线和空格。

如果你得到Timeline_Integration的匹配,你也会获得TimelineIntegration的匹配,所以我有点困惑为什么你希望每个排列可以用' _'替换空格。或者''。

示例:搜索"时间轴整合方法":

搜索" Timeline_Integration":

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

除非我完全误解了目标,否则我认为一个可能的解决办法就是完全删除第一个搜索并执行以下操作:

解决方案:

对空间不敏感

search_string ='' .join([x为search_string中的x,如果x!=''和x!=' _']) to_be_searched_string ='' .join([x表示to_be_searched_string中的x,如果x!=''和x!=' _'])

对空间敏感

search_string ='' .join([x为search_string中的x,如果x!='' else' _']) to_be_searched_string ='' .join([x for to_be_searched_string如果x!=''其他' _'])