Python 将字符串中的数字替换为#,并删除所有非数字字符

Python 将字符串中的数字替换为#,并删除所有非数字字符,python,string,replace,Python,String,Replace,将特定字符替换为“#”,但没有替换。代码中有什么错误 输入: A="234" for i in range (len(A)): if (A[i].isdigit()): print(A[i]) A.replace(A[i],"#"); print(A) 输出: 2 3 4 234 A.replace(A[i],“#”)将只返回另一个字符串,而不会覆盖原始字符串。执行以下操作以覆盖它: A="234" for i in range (len(A)): if

将特定字符替换为“#”,但没有替换。代码中有什么错误

输入:

A="234"

for i in range (len(A)):

  if (A[i].isdigit()):

    print(A[i])

    A.replace(A[i],"#");

print(A)
输出:

2
3
4
234
A.replace(A[i],“#”)将只返回另一个字符串,而不会覆盖原始字符串。执行以下操作以覆盖它:

A="234"

for i in range (len(A)):

  if (A[i].isdigit()):

    print(A[i])

    A = A.replace(A[i],"#");

print(A)

将正则表达式与python的内置
re
模块一起使用可能会更容易。然后你可以在两个正则表达式中完成

re.sub(r'[^\d]', '', A)
re.sub(r'\d', '#', A)

对于您询问的代码,@AnnZen(+1)提供的建议是合理的,尽管我会抛出分号和额外的括号。我还将循环字符串中的字符,而不是它们的索引:

for c in A:
    if c.isdigit():
        A = A.replace(c, "#")
至于解决完整问题(即添加非数字消除),我们实际上不需要
replace()

但是,如果我们想使用
replace()
,这似乎是一个同时使用
defaultdict
的机会:

from collections import defaultdict

dictionary = defaultdict(str, {digit: '#' for digit in "0123456789"})

def convert(string):
    for character in string:
        string = string.replace(character, dictionary[character])

    return string
我们可以附加一些测试代码来检查它:

if __name__ == "__main__":  # test code
    from random import choice, randint
    from string import ascii_letters, digits

    for tests in range(10):
        test_string = ''.join(choice(ascii_letters + digits) for _ in range(randint(10, 20)))

        print(repr(test_string), end=' -> ')

        test_string = convert(test_string)

        print(repr(test_string))
输出

> python3 test.py
'RzfMD5w3LQO' -> '##'
'NrFsFDDyOit593' -> '###'
'TpURdM0PqTQtaPe3IeP' -> '##'
'TN10mz39BukFNsgf' -> '###'
'ghYfxDLrPSEG5GCO' -> '#'
'9QAJ1PVyegMD' -> '#'
'GOIgOmzpC1ysn4' -> '#'
'LEdR2BafYi9paALgrN' -> '##'
'L2hzkSQNkH2Gb' -> '##'
'E6rnoGi2AamWW01R19' -> '####'
>
@duckboycool的正则表达式思想有其优点,即使目前建议的实现没有。我们不需要两个模式匹配,只需要一个来消除非数字:

import re

def convert(string):
    return '#' * len(re.sub(r'\D', '', string))

我的各种
convert()
功能中的任何一个都应该与上面的测试代码一起使用。

问题是您没有保存您的工作。试试这个:
A=A.replace(A[i],“#”)
。这是没有用的;如果您将第一个结果分配回
A
,但
re.sub
不会在适当的位置编辑字符串,则这将起作用。
import re

def convert(string):
    return '#' * len(re.sub(r'\D', '', string))