1
考虑到与数字的字符串:在串数字转换为`_NUM - * _`符号
I counted, ' 1 2 3 4 5 5 5 8 9 10 '
的目标是将数字转换为_NUM-*_
符号,其中*
表示,通过该号码出现顺序。例如。给定上述intpu,期望的输出是:
"I counted, ' _NUM-1_ _NUM-2_ _NUM-3_ _NUM-4_ _NUM-5_ _NUM-6_ _NUM-7_ _NUM-8_ _NUM-9_ _NUM-10_'"
即使重复数字,例如,给定输入
I said, ' 1 2 3 4 5 5 5 8 9 10 '
所需的输出保持数忽略了数字本身例如值的顺序:
"I said, ' _NUM-1_ _NUM-2_ _NUM-3_ _NUM-4_ _NUM-5_ _NUM-6_ _NUM-7_ _NUM-8_ _NUM-9_ _NUM-10_'"
我已经试过:
import re
s = "I counted, ' 1 2 3 4 5 6 7 8 9 10 '"
num_regexp = '(?<!\S)(?=.)(0|([1-9](\d*|\d{0,2}(,\d{3})*)))?(\.\d*[1-9])?(?!\S)'
re.sub(num_regexp, '_NUM_', s)
但它只是用相同的_NUM_
符号替换输出而不保留顺序,即
[OUT]:
"I counted, ' _NUM_ _NUM_ _NUM_ _NUM_ _NUM_ _NUM_ _NUM_ _NUM_ _NUM_ _NUM_ _NUM_ '"
我可以做一个后re.sub
操作,更换各_NUM_
,即
import re
s = "I counted, ' 1 2 3 4 5 6 7 8 9 10 '"
num_regexp = '(?<!\S)(?=.)(0|([1-9](\d*|\d{0,2}(,\d{3})*)))?(\.\d*[1-9])?(?!\S)'
num_counter = 1
tokens = []
for token in re.sub(num_regexp, '_NUM_', s).split():
if token == '_NUM_':
token = '_NUM-{}_'.format(num_counter)
num_counter += 1
tokens.append(token)
result = ' '.join(tokens)
[出]:
"I counted, ' _NUM-1_ _NUM-2_ _NUM-3_ _NUM-4_ _NUM-5_ _NUM-6_ _NUM-7_ _NUM-8_ _NUM-9_ _NUM-10_ '"
是一种更好的方式来实现所需的输出没有先通用re.sub
,然后进行事后字符串编辑?
酷!我不知道'itertools.count',在替换内部使用lambda表达式超级酷! – alvas