我在python中有一个字符串,其中包含符号和字母数字字符。如果in字符串的两个字母数字字符之间有符号或空格,那么我想将它们替换为一个空格,“以提高可读性”。
注意:re.findall()
返回所有子字符串,但re.sub()
不能替换所有子字符串。
输入:-
#It#%%is$Matrix%%$script$Trinity
预期输出:-
#It is Matrix script Trinity
我已经尝试过下面的代码,但是它给出了预期的输出,任何python / regex专家都可以提供帮助?
import re
b= "#It#%%is$Matrix%%$script$Trinity"
print(re.findall(r'(?<=\w)(\W+)(?=\w)',b,re.IGNORECASE))
['#%%', '$', '%%$', '$']
print(re.sub(r'(?<=\w)(\W+)(?=\w)'," ",b,re.IGNORECASE))
#It is Matrix%%$script$Trinity
[re.sub具有与re.findall不同的签名:
re.findall(pattern, string, flags=0)
re.sub(pattern, repl, string, count=0, flags=0)
因此,您的标志re.IGNORECASE
恰好是2,正以count
的形式传递,sub
函数将其解释为“请仅替换前两次出现”。
要解决此问题,您需要将标志作为关键字参数传递或手动添加count参数:
print(re.sub(r'(?<=\w)(\W+)(?=\w)', " ", b, flags=re.IGNORECASE))
print(re.sub(r'(?<=\w)(\W+)(?=\w)', " ", b, 0, re.IGNORECASE))
当您执行以下操作时:
print(re.sub(r'(?<=\w)(\W+)(?=\w)'," ",b,re.IGNORECASE))
您有效地将count
参数设置为2
,因为这是re.IGNORECASE
评估为整数的值。因此,仅替换前2个匹配项。定义count
:
print(re.sub(r'(?<=\w)(\W+)(?=\w)', " ", b, 0, re.IGNORECASE))
或使用flags
关键字:
print(re.sub(r'(?<=\w)(\W+)(?=\w)', " ", b, flags=re.IGNORECASE))