2017-07-02 42 views
1

在Python 3中,我有字符串“up2 left5 right4 down2”。我希望将其转换为“u2 l5 r4 d2”,并保留数字。这样做最有效的方法是什么?我想有比4个正则表达式更好的方法。替代多个正则表达式替换Python中的已知单词

唯一可能的词是“向上”“向下”“左”和“右”,数字可以是0到999之间的任何数字。我怎样才能有效地用这些单词的1个字符的缩写代替这4个词?

回答

6
for t in (('up', 'u'), ('down','d'), ('left','l'), ('right', 'r')): 
    mystring = mystring.replace(*t) 

,或者服用的事实,更换为一个字始终其首字母优点:

for word in ('up','down','left','right'): 
    mystring = mystring.replace(word, word[0]) 
-2

仅使用1个正则表达式替换,捕捉的4个字的第一个字母和使用它们替换字符串:

import re 

mystring = " up2 left5 right4 down2 up left right down xyz whatsup9 yeahright10" 
mystring = re.sub(r"\b(?:(u)p|(d)own|(l)eft|(r)ight)(?=\d+)",r"\1\2\3\4",mystring) 

结果:

mystring 
=> ' u2 l5 r4 d2 up left right down xyz whatsup9 yeahright10' 

增加了前视(?=\d+)以声明该单词后面跟着一个数字。
使用了单词边界\b,因此如果它只是较大单词的一部分,则不会替换单词。

1

到Błotosmętek的溶液的替代(其将是稍微慢)时,可以有一个包含词作为键和它们的第一个字母为一个值的字典:

d = {"up": "u", "down": "d", "left": "l", "right": "r"} 

for key, val in d.items(): 
    s = s.replace(key, val) 
0
import re 
s = "up2 left5 right4 down2" 
[ l[0][0] + l[1] for l in re.findall(r'([a-z]*)(\d+)', s) ] 

输出:

['u2', 'l5', 'r4', 'd2']