在Python 3中,我有字符串“up2 left5 right4 down2”。我希望将其转换为“u2 l5 r4 d2”,并保留数字。这样做最有效的方法是什么?我想有比4个正则表达式更好的方法。替代多个正则表达式替换Python中的已知单词
唯一可能的词是“向上”“向下”“左”和“右”,数字可以是0到999之间的任何数字。我怎样才能有效地用这些单词的1个字符的缩写代替这4个词?
在Python 3中,我有字符串“up2 left5 right4 down2”。我希望将其转换为“u2 l5 r4 d2”,并保留数字。这样做最有效的方法是什么?我想有比4个正则表达式更好的方法。替代多个正则表达式替换Python中的已知单词
唯一可能的词是“向上”“向下”“左”和“右”,数字可以是0到999之间的任何数字。我怎样才能有效地用这些单词的1个字符的缩写代替这4个词?
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])
仅使用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
,因此如果它只是较大单词的一部分,则不会替换单词。
到Błotosmętek的溶液的替代(其将是稍微慢)时,可以有一个包含词作为键和它们的第一个字母为一个值的字典:
d = {"up": "u", "down": "d", "left": "l", "right": "r"}
for key, val in d.items():
s = s.replace(key, val)
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']