做到这一点的最佳方法是用字符串中的“-”替换字符列表。

时间:2019-07-16 19:01:55

标签: python-3.x list list-comprehension

我想将这些符号替换为'-',我知道应该有比这更好的方法:

if '/' in var1:
    var1= var1.replace('/', '-')
if '#' in var1:
    var1= var1.replace('#', '-')
if ';' in var1:
    var1 = var1.replace(';', '-')
if ':' in var1:
    var1= var1.replace(':', '-')

这是我尝试过的方法,这显然是错误的,我无法对其进行适当的优化。

str = 'Testing PRI/Sec (#434242332;PP:432:133423846,335)'
a = ['#',':',';','/']
print([str.replace(i,'-') for i in str])

replaceAll不起作用,给我一个错误,说str没有该属性。

str.replaceAll("[<>]", "")

4 个答案:

答案 0 :(得分:3)

如何使用str.translate()

# make a translation table that replaces any of "#:;/" with hyphens
hyphenator = str.maketrans({c: "-" for c in "#:;/"})
# use str.translate to apply it
print("Testing PRI/Sec (#434242332;PP:432:133423846,335)".translate(hyphenator))

或者,甚至更快,使用编译后的正则表达式:

compiled_re = re.compile("|".join(re.escape(i) for i in "#:;/"))
print(compiled_re.sub("-", "Testing PRI/Sec (#434242332;PP:432:133423846,335)"))

这两种方法都比其他建议的方法快得多(至少在该输入上如此):

import re
import timeit

s = "Testing PRI/Sec (#434242332;PP:432:133423846,335)"
a = ["#", ":", ";", "/"]
hyphenator = str.maketrans({c: "-" for c in "#:;/"})


def str_translate():
    s.translate(hyphenator)


def join_generator():
    "".join("-" if ch in a else ch for ch in s)


def append_in_loop():
    temp = ""
    for i in s:
        if i in a:
            temp += "-"
        else:
            temp += i


def re_sub():
    re.sub("|".join(re.escape(i) for i in a), "-", s)

def compiled_re_sub():
    compiled_re.sub("-", s)

for method in [str_translate, join_generator, re_sub, append_in_loop, compiled_re_sub]:
    # run a million iterations and report the total time
    print("{} took a total of {}s".format(method.__name__, timeit.timeit(method)))

我的机器上的结果:

str_translate took a total of 1.1160085709998384s
join_generator took a total of 4.599312704987824s
re_sub took a total of 4.101858579088002s
append_in_loop took a total of 4.257988628000021s
compiled_re_sub took a total of 1.0353244650177658s

答案 1 :(得分:1)

s = 'Testing PRI/Sec (#434242332;PP:432:133423846,335)'
a = ['#',':',';','/']

print(''.join('-' if ch in a else ch for ch in s))

打印:

Testing PRI-Sec (-434242332-PP-432-133423846,335)

或使用re

s = 'Testing PRI/Sec (#434242332;PP:432:133423846,335)'
a = ['#',':',';','/']

import re
print(re.sub('|'.join(re.escape(i) for i in a), '-', s))

打印:

Testing PRI-Sec (-434242332-PP-432-133423846,335)

答案 2 :(得分:1)

只需循环遍历,除非将每个字符添加到temp变量中,除非它在列表“ a”中,否则只需在变量中添加“-”来替换它即可。

str = 'Testing PRI/Sec (#434242332;PP:432:133423846,335)'
a = ['#',':',';','/']
temp = ''
for i in str:
    if i in a:
        temp = temp + "-"
    else:
        temp = temp + i
print(temp)

答案 3 :(得分:1)

使用重新包装

import re
string = 'Testing PRI/Sec (#434242332;PP:432:133423846,335)'
result = re.sub('[#:;/]',"-", string)
print(result)

结果:

Testing PRI-Sec (-434242332-PP-432-133423846,335)