Python 如何拆分带有特殊字符的字符串而不删除这些字符?
我正在编写这个函数,它需要返回一个Python 如何拆分带有特殊字符的字符串而不删除这些字符?,python,python-3.x,string,special-characters,Python,Python 3.x,String,Special Characters,我正在编写这个函数,它需要返回一个str的缩写版本。返回的str必须包含第一个字母、删除的字符数和最后一个字母;它必须是每个单词的缩写,而不是每个句子的缩写,然后我需要用相同的格式再次连接每个单词,包括特殊字符。我尝试使用re.findall()方法,但它会自动删除特殊字符,因此我无法使用“”.join(),因为它将省略特殊字符 这是我的密码: import re def abbreviate(wrd): return " ".join([i if len(i) &l
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!
不需要
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!
>>>
e6t-r3s are not fun!
也许其他人可以用更可爱的模式或任何其他建议来改进这个答案。现在编写模式的方式是,假设您只处理小写字母,因此需要记住这一点,但是修改它以满足您的需要应该非常简单。我并不真正喜欢重复
[a-z]
,但这是我能想到的在单独的捕获组中捕获单词“内部”字符的最快方法。你也可能想考虑应该发生什么样的词/收缩如“代码>”不要“<代码/代码>或代码>”不应该“< /代码> ./p> < p>谢谢您查看我的问题。经过多次搜索、尝试和出错后,我终于找到了一种方法,可以在不做太多更改的情况下正确地执行代码。我只是简单地用re.split(r'([\w\d\)),wrd)替换了re.findall(r“[\w']+”,wrd)
,并删除了”.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!"))
我想在不做太多修改的情况下改进代码。但是谢谢你,我很感激你的回答,我也会尝试这种方法。
e6t-r3s are not fun!