为什么这不起作用?
re.sub('\\b[a@](\\W|[a@])*[s5$](\\W|[s5$])*[s5$](\\W|[s5$])*($|\\W)', '*', '@ss')
我不明白为什么@ss
不替换为*
. 同样,@55
不更换。
这些被替换:a55、a5s、as5、ass
谢谢!
为什么这不起作用?
re.sub('\\b[a@](\\W|[a@])*[s5$](\\W|[s5$])*[s5$](\\W|[s5$])*($|\\W)', '*', '@ss')
我不明白为什么@ss
不替换为*
. 同样,@55
不更换。
这些被替换:a55、a5s、as5、ass
谢谢!
这是因为@
不是单词字符,因此第一个\b
不匹配。
这是我的建议:
re.sub('(\\ba|@)(\\W|[a@])*[s5$](\\W|[s5$])*[s5$](\\W|[s5$])*($|\\W)', '*', '@ss')
(替换\b[a@]
为(\ba|@)
)
第一部分周围没有一对括号。试试这个:
re.sub('(\\b[a@])*(\\W|[a@])*[s5$](\\W|[s5$])*[s5$](\\W|[s5$])*($|\\W)', '*', '@ss')
如果您正在尝试一种“亵渎”检查 - 我会将逻辑从正则表达式中取出。
look_alike = {'@': 'A', '$': 'S'}
test_string = ''.join(look_alike.get(c, c) for c in your_string.upper()) # also look at `string.translate`
然后if 'ASS' in test_string
- 或与使用 re 的单词边界类似。