用x替换字符串中的整数而不进行错误处理

Abd*_*dou 5 python string replace

我一直试图找出一种简单的方法来在python中用x替换字符串中的整数.通过执行以下操作,我能够获得一些好处:

In [73]: string = "martian2015"
In [74]: string = list(string)

In [75]: for n, i in enumerate(string):
   ....:     try:
   ....:         if isinstance(int(i), int):
   ....:             string[n]='x'
   ....:     except ValueError:
   ....:         continue
Run Code Online (Sandbox Code Playgroud)

这实际上产生如下内容:

In [81]: string
Out[81]: ['m', 'a', 'r', 't', 'i', 'a', 'n', 'x', 'x', 'x', 'x']
In [86]: joiner = ""

In [87]: string = joiner.join(string)

In [88]: string
Out[88]: 'martianxxxx'
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有办法以更简单的方式获得结果而不依赖于错误/异常处理

Mic*_*x2a 9

是的,使用正则表达式和re模块:

import re

new_string = re.sub("\d", "x", "martin2015")
Run Code Online (Sandbox Code Playgroud)

该字符串"\d"告诉Python搜索字符串中的所有数字.第二个参数是你要用所有匹配替换的,第三个参数是你的输入.(re.sub代表"替代")


the*_*eye 7

你可以像这样使用str.isdigit函数和列表推导

>>> data = "martian2015"
>>> "".join(["x" if char.isdigit() else char for char in data])
'martianxxxx'
Run Code Online (Sandbox Code Playgroud)

如果isdigit函数中的True所有字符都是数字,则该函数将返回.所以,如果它是一个数字,那么我们使用"x"否则我们使用实际的字符本身.


您实际上可以使用生成器表达式而不是列表推导来执行相同的操作,就像这样

>>> "".join("x" if char.isdigit() else char for char in data)
'martianxxxx'
Run Code Online (Sandbox Code Playgroud)

唯一的区别是生成器是惰性求值的,不像构建整个列表的列表推导.生成器仅根据需要提供值.在这里阅读更多相关信息.

但是在这种特殊情况下,str.join无论如何都会建立列表.


如果你打算经常做这种替换,那么你可能想知道str.translatestr.maketrans.

>>> mapping = str.maketrans("0123456789", "x" * 10)
>>> "martin2015".translate(mapping)
'martinxxxx'
>>> "10-03-2015".translate(mapping)
'xx-xx-xxxx'
>>> 
Run Code Online (Sandbox Code Playgroud)

maketrans构建与值的第一串和第二串中的相应字符的字符代码的字典.因此,当我们使用mappingwith时translate,只要它在中找到一个字符mapping,它就会简单地用相应的值替换它.