想象一下我有一根像 dslkf 234 dkf23 12asd 2 23 4 . 我想用 <NUM> .
dslkf 234 dkf23 12asd 2 23 4
<NUM>
我试过了 re.sub('\s\d+\s', ' <NUM> ', s) 1.我想要 dslkf <NUM> dkf23 12asd <NUM> <NUM> <NUM> 但最终我得到的是: dslkf <NUM> dkf23 12asd <NUM> 23 4
re.sub('\s\d+\s', ' <NUM> ', s)
dslkf <NUM> dkf23 12asd <NUM> <NUM> <NUM>
dslkf <NUM> dkf23 12asd <NUM> 23 4
我知道为什么没有替换“4”,因为它后面没有任何空格字符。 但对于另一个,我不知道为什么。
你不一定需要正则表达式来做这件事,这里有一个 更快 替代使用 split() 和 join() :
split()
join()
data = "dslkf 234 dkf23 12asd 2 23 4" new_data = " ".join(word if not word.isdigit() else "<NUM>" for word in data.split()) print(new_data) # dslkf <NUM> dkf23 12asd <NUM> <NUM> <NUM>
我自己找到了答案。 使用lookback和lookahead非常有用。 最后,我得到了 $ 签名 代码如下所示:
$
pattern = "(?<=\s)\d+(?=\s|$)"
new_s = re.sub(pattern, '<NUM>', s)
虽然我在发帖前找到了答案,但由于没有找到类似的问题,我还是把这个问题发了出来,供未来的求职者参考。
更换 \b\d+\b :
\b\d+\b
inp = "dslkf 234 dkf23 12asd 2 23 4" output = re.sub(r'\b\d+\b', r'<NUM>', inp) print(output) # dslkf <NUM> dkf23 12asd <NUM> <NUM> <NUM>