用 x 替换字符串中的整数而不进行错误处理
replacing the integers in a string with x's without error handling
我一直在尝试找出一种简单的方法来用 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
这实际上会产生如下内容:
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'
我的问题是:有没有什么方法可以更简单的方式得到结果而不依赖error/exception处理?
将isinstance
更改为.isdigit
string = "martian2015"
for i in string:
if i.isdigit():
string.replace(i, "x")
是,使用正则表达式和 re
模块:
import re
new_string = re.sub("\d", "x", "martin2015")
字符串 "\d"
告诉 Python 搜索字符串中的所有数字。第二个参数是你想要替换所有匹配项的内容,第三个参数是你的输入。 (re.sub
代表"substitute")
你可以像这样使用str.isdigit
function and list comprehension
>>> data = "martian2015"
>>> "".join(["x" if char.isdigit() else char for char in data])
'martianxxxx'
如果其中的所有字符都是数字,isdigit
函数将 return True
。所以,如果它是一个数字,那么我们使用 "x"
否则我们使用实际字符本身。
你实际上可以使用生成器表达式而不是列表理解来做同样的事情,就像这样
>>> "".join("x" if char.isdigit() else char for char in data)
'martianxxxx'
唯一的区别是生成器是惰性求值的,这与构建整个列表的列表理解不同。生成器只会按需提供值。了解更多关于它们的信息 here。
但在这种特殊情况下,使用 str.join
,无论如何都会构建列表。
如果您打算经常进行这种替换,那么您可能想了解 str.translate
and str.maketrans
。
>>> mapping = str.maketrans("0123456789", "x" * 10)
>>> "martin2015".translate(mapping)
'martinxxxx'
>>> "10-03-2015".translate(mapping)
'xx-xx-xxxx'
>>>
maketrans
用第一个字符串中值的字符代码和第二个字符串中的相应字符构建一个字典。因此,当我们将 mapping
与 translate
一起使用时,只要它在 mapping
中找到一个字符,它就会简单地将其替换为相应的值。
In [102]: import string
In [103]: mystring
Out[103]: 'martian2015'
In [104]: a='x'*10
In [105]: leet=maketrans('0123456789',a)
In [106]: mystring.translate(leet)
Out[106]: 'martianxxxx'
如果不知道高级数据处理方法,可以调用string
模块过滤num字符串。
import string
old_string = "martin2015"
new_string = "".join([s if s not in string.digits else "x" for s in old_string ])
print new_string
# martinxxxx
虽然我知道我的答案不是最好的解决方案,但我想提供不同的方法来帮助人们解决问题。
我一直在尝试找出一种简单的方法来用 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
这实际上会产生如下内容:
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'
我的问题是:有没有什么方法可以更简单的方式得到结果而不依赖error/exception处理?
将isinstance
更改为.isdigit
string = "martian2015"
for i in string:
if i.isdigit():
string.replace(i, "x")
是,使用正则表达式和 re
模块:
import re
new_string = re.sub("\d", "x", "martin2015")
字符串 "\d"
告诉 Python 搜索字符串中的所有数字。第二个参数是你想要替换所有匹配项的内容,第三个参数是你的输入。 (re.sub
代表"substitute")
你可以像这样使用str.isdigit
function and list comprehension
>>> data = "martian2015"
>>> "".join(["x" if char.isdigit() else char for char in data])
'martianxxxx'
如果其中的所有字符都是数字,isdigit
函数将 return True
。所以,如果它是一个数字,那么我们使用 "x"
否则我们使用实际字符本身。
你实际上可以使用生成器表达式而不是列表理解来做同样的事情,就像这样
>>> "".join("x" if char.isdigit() else char for char in data)
'martianxxxx'
唯一的区别是生成器是惰性求值的,这与构建整个列表的列表理解不同。生成器只会按需提供值。了解更多关于它们的信息 here。
但在这种特殊情况下,使用 str.join
,无论如何都会构建列表。
如果您打算经常进行这种替换,那么您可能想了解 str.translate
and str.maketrans
。
>>> mapping = str.maketrans("0123456789", "x" * 10)
>>> "martin2015".translate(mapping)
'martinxxxx'
>>> "10-03-2015".translate(mapping)
'xx-xx-xxxx'
>>>
maketrans
用第一个字符串中值的字符代码和第二个字符串中的相应字符构建一个字典。因此,当我们将 mapping
与 translate
一起使用时,只要它在 mapping
中找到一个字符,它就会简单地将其替换为相应的值。
In [102]: import string
In [103]: mystring
Out[103]: 'martian2015'
In [104]: a='x'*10
In [105]: leet=maketrans('0123456789',a)
In [106]: mystring.translate(leet)
Out[106]: 'martianxxxx'
如果不知道高级数据处理方法,可以调用string
模块过滤num字符串。
import string
old_string = "martin2015"
new_string = "".join([s if s not in string.digits else "x" for s in old_string ])
print new_string
# martinxxxx
虽然我知道我的答案不是最好的解决方案,但我想提供不同的方法来帮助人们解决问题。