Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何拆分带有特殊字符的字符串而不删除这些字符?_Python_Python 3.x_String_Special Characters - Fatal编程技术网

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!