【问题标题】:How to split strings with special characters without removing those characters?如何在不删除这些字符的情况下拆分带有特殊字符的字符串?
【发布时间】:2020-11-15 02:28:53
【问题描述】:

我正在编写这个函数,它需要返回一个str 的缩写版本。返回str 必须包含第一个字母,删除的字符数和最后一个字母;它必须是每个单词而不是句子的缩写,然后我需要以相同的格式再次加入每个单词,包括特殊-人物。我尝试使用re.findall() 方法,但它会自动删除特殊字符,所以我不能使用" ".join(),因为它会遗漏特殊字符。

这是我的代码:

import re
def abbreviate(wrd):
    return " ".join([i if len(i) < 4 else i[0] + str(len(i[1:-1])) + i[-1] for i in re.findall(r"[\w']+", wrd)]) 

print(abbreviate("elephant-rides are really fun!"))

输出将是:

e6t r3s are r4y fun

但是输出应该是:

e6t-r3s are r4y fun!

【问题讨论】:

    标签: python python-3.x string special-characters


    【解决方案1】:

    不需要str.join。不妨充分利用re 模块所提供的功能。

    re.sub 接受字符串或可调用对象(如函数或 lambda),它将当前匹配项作为输入,并且必须返回一个字符串来替换当前匹配项。

    import re
    
    pattern = "\\b[a-z]([a-z]{2,})[a-z]\\b"
    string = "elephant-rides are really fun!"
    
    def replace(match):
        return f"{match.group(0)[0]}{len(match.group(1))}{match.group(0)[-1]}"
    
    abbreviated = re.sub(pattern, replace, string)
    
    print(abbreviated)
    

    输出:

    e6t-r3s are r4y fun!
    >>> 
    

    也许其他人可以通过更可爱的模式或任何其他建议来改进这个答案。现在编写模式的方式假设您只处理小写字母,因此请记住这一点 - 但修改它以满足您的需要应该非常简单。我不太喜欢重复[a-z],但这只是我能想到的在单独的捕获组中捕获单词的“内部”字符的最快方法。您可能还需要考虑使用 "don't""shouldn't" 等单词/缩略词会发生什么。

    【讨论】:

    • 我想改进我的代码而不做太多改动。不过谢谢,谢谢你的回答,我也会试试这个方法。
    【解决方案2】:

    感谢您查看我的问题。经过几次搜索、反复试验和错误,我终于找到了一种无需过多更改即可正确执行代码的方法。我只是简单地将re.findall(r"[\w']+", wrd) 替换为re.split(r'([\W\d\_])', wrd) 并删除了"".join() 中的whitespace,因为它们根本不再需要了。

        import re
        def abbreviate(wrd):
            return "".join([i if len(i) < 4 else i[0] + str(len(i[1:-1])) + i[-1] for i in re.split(r'([\W\d\_])', wrd)])
    
         print(abbreviate("elephant-rides are not fun!"))
    

    输出:

         e6t-r3s are not fun!
    

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 2019-11-20
      • 1970-01-01
      • 2019-01-21
      • 2013-05-10
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2021-07-02
      相关资源
      最近更新 更多