我有如下字符串(目的是除去字符串末尾的字母数字字符之间的非字母数字字符)
字符串:This$#is% Matrix# %!
我想要的是:This is Matrix# %!
所以我只想消除非字母数字,而不是最后。
我尝试过此正则表达式代码str1 = re.sub(r'([^\s\w]|_)+', ' ', str1)
,但它消除了所有非alp,包括末尾的非alp。
我该如何解决这个棘手的问题
答案 0 :(得分:2)
您可以使用否定的超前断言。
>>> s = "This$#is% Matrix# %!"
>>> re.sub(r'([^\s\w]|_)+(?![^\w]*$)', ' ', s)
'This is Matrix# %!'
答案 1 :(得分:0)
我建议您进行两次通过:
用空格替换一堆“坏”字符。
用一个空格替换一堆空格。
您曾说过,您只想在后面有字母数字的情况下删除不良字符。您可以为此使用零宽度的超前查询:
bad_chars = r'([^\s\w]|_)+(?=\s*\w)'
(?=...)
是positive lookahead,,它向前看,以查看模式\s*\w
是否与当前位置匹配,但不匹配向前移动-它看起来就很好。
然后用空格替换,折叠空格,就可以完成:
re.sub(bad_chars, ' ', mystring)
re.sub('\s\s+', ' ', mystring)
print(mystring)
答案 2 :(得分:0)
嗨,我觉得我的问题仍然没有得到回答,正如您在下面的输出中看到的那样,我只希望将2个字母字符之间的非字母数字替换为1个空格,矩阵后的部分应保留为它不在字母字符之间。
输入字符串This $#is%Matrix#(这里2个空格)%!
您的输出(标准输出) 这是Matrix#(此处为1个空格)%!
预期输出下载 这是Matrix#(此处为2个空格)%!