繁体   English   中英

如何在不删除这些字符的情况下拆分带有特殊字符的字符串?

[英]How to split strings with special characters without removing those characters?

我正在写这个 function ,它需要返回一个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!"))

output 将是:

e6t r3s are r4y fun

但是 output 应该是:

e6t-r3s are r4y fun!

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

re.sub接受字符串或可调用的 object(如 function 或 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)

Output:

e6t-r3s are r4y fun!
>>> 

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

感谢您查看我的问题。 经过几次搜索、反复试验和错误,我终于找到了一种无需过多更改即可正确执行代码的方法。 我只是用re.split(r'([\W\d\_])', wrd)替换re.findall(r"[\w']+", wrd) wrd) 并且还删除了"".join()中的whitespace "".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.split(r'([\W\d\_])', wrd)])

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

Output:

     e6t-r3s are not fun!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM