Python 通过在列表前面添加反斜杠来转义列表中的保留字符
在列表中的每个元素中循环并在保留字符前面添加\(如果其中一个元素包含它们)的最快方法是什么 期望输出:Python 通过在列表前面添加反斜杠来转义列表中的保留字符,python,regex,string,list,Python,Regex,String,List,在列表中的每个元素中循环并在保留字符前面添加\(如果其中一个元素包含它们)的最快方法是什么 期望输出: reserved_chars = "? & | ! { } [ ] ( ) ^ ~ * : \ " ' + -" list_vals = ['gold-bear@gmail.com', 'P&G@dom.com', 'JACKSON! BOT', 'annoying\name'] 您可以使用str.maketrans()创建一个翻译表,并将其传递到translate中。这需
reserved_chars = "? & | ! { } [ ] ( ) ^ ~ * : \ " ' + -"
list_vals = ['gold-bear@gmail.com', 'P&G@dom.com', 'JACKSON! BOT', 'annoying\name']
您可以使用
str.maketrans()
创建一个翻译表,并将其传递到translate中。这需要一点设置,但您可以重用翻译表,而且速度非常快:
fixed_list = ['gold\-bear@gmail.com', 'P\&G@dom.com', 'JACKSON\! BOT', 'annoying\\name']
印刷品:
reserved_chars = '''?&|!{}[]()^~*:\\"'+-'''
list_vals = ['gold-bear@gmail.com', 'P&G@dom.com', 'JACKSON! BOT', 'annoying\\name']
# make trans table
replace = ['\\' + l for l in reserved_chars]
trans = str.maketrans(dict(zip(reserved_chars, replace)))
# translate with trans table
fixed_list = [s.translate(trans) for s in list_vals]
print("\n".join(fixed_list))
没有快速的方法-你有字符串,字符串是不可变的,你需要创建新的 也许最好的方法是建立自己的翻译词典,自己动手做繁重的工作:
gold\-bear@gmail.com
P\&G@dom.com
JACKSON\! BOT
annoying\\name
输出:
reserved = """? & | ! { } [ ] ( ) ^ ~ * : \ " ' + -"""
tr = { c:f"\\{c}" for c in reserved}
print(tr)
data = ['gold-bear@gmail.com', 'P&G@dom.com', 'JACKSON! BOT', 'annoying\name']
transformed = [ ''.join(tr.get(letter,letter) for letter in word) for word in data]
for word in transformed:
print(word)
旁注:
- 您的示例未能逃出
李>'JACKSON\中的空间!BOT'
转换的
列表的
看起来是“错误”转义的,因为在打印时,它会再次转义每个repl()
本身-正在打印的内容请参见wordlist'\'
- 肯定不是最快的,但可能是最容易编码的。制作一个为您执行此操作的正则表达式,然后运行re.sub,如下所示:
# translation dictionary
{'?': '\\?', ' ': '\\ ', '&': '\\&', '|': '\\|', '!': '\\!', '{': '\\{',
'}': '\\}', '[': '\\[', ']': '\\]', '(': '\\(', ')': '\\)', '^': '\\^',
'~': '\\~', '*': '\\*', ':': '\\:', '\\': '\\\\', '"': '\\"', "'": "\\'",
'+': '\\+', '-': '\\-'}
# transformed strings
gold\-bear@gmail.com
P\&G@dom.com
JACKSON\!\ BOT
annoying
ame
再次澄清一下,正则表达式的速度很慢。这不是有效的python-您需要至少转义字符串中的
“
”才能实现这一点-或者使用“”和“”前后划界字符串。不知道maketrans也适用于1到多个转换-很好one@PatrickArtner-是的,这不明显,但你可以传递一个dict来替换多个字符。嗨,你很接近,最后的输出必须是一个列表,最后一个元素有“恼人的\名称”,其中有一个反斜杠it@TH14在回答中,fixed_list
是一个列表。如果你看你的问题,你想要的输出有“恼人的\\name”,因为反斜杠必须转义(除非你想在那里有一个新行\n
。是的,想要的输出应该有“恼人的\\name”,但在你的列表中是“恼人的\\name”,我得到这个输出,[黄金]\\-bear@gmail.com“,”P\\&G@dom.com“,”JACKSON\\!BOT“,”恼人的\\\\name'],在保留的战车前面应该只有一个反斜杠,您的输出将再次转义反斜杠。使用以下内容进行打印:对于转义值中的x:Print(x)
我正在将元素添加到另一个列表中,而不仅仅是打印它们。您正在某个点直接打印它,或者使用str()等将其转换为字符串。这将跳过反斜杠。上面的re.sub没有添加额外的反斜杠。我刚刚运行它,并使用print(','.join(转义值))打印输出
,获得金牌\-bear@gmail.com,P\&G@dom.com,JACKSON\!BOT,恼人的\\name
输出。通过简单的打印(转义值)
我确实得到了['gold\\-bear@gmail.com“,”P\\&G@dom.com“,”JACKSON\\!BOT“,”恼人的\\\\name']
,我几乎100%肯定你最终也会做类似的事情。
import re
reserved_chars = "?&|!{}[]()^~*:\\\"'+-"
replace_regex = "([" + ''.join('\\x%x' % ord(x) for x in reserved_chars) + "])"
list_vals = ['gold-bear@gmail.com', 'P&G@dom.com', 'JACKSON! BOT', r'annoying\name']
escaped_vals = [re.sub(replace_regex, r"\\\1", x) for x in list_vals]