我有以下正则表达式来解析括号内的访问字符串并删除它们:
>>> a = 'a[b]cdef[g ]hi[ j]klmno[ p ]'
>>> re.sub(r'\[\s?(.*?)\s?\]',r'\1',a)
'abcdefghijklmnop'
但我想要做的是用括号中的内容作为字典。假设我有以下词典:
d = {'b':2,'g':7,'j':10,'p':16}
当我运行我想要的正则表达式时,它应该打印字符串:'a2cdef7hi10klmno16'
但是,我不能简单地将sub
的替换部分设为d['\1']
,因为会有KeyError: '\x01'
。
是否有任何简单的方法可以使用字典替换正则表达式中的捕获字典?
答案 0 :(得分:3)
您可以使用format
,假设a
不包含{...}
形式的子字符串:
>>> import re
>>> a = 'a[b]cdef[g ]hi[ j]klmno[ p ]'
>>> d = {'b':2,'g':7,'j':10,'p':16}
>>>
>>> re.sub(r'\[\s?(.*?)\s?\]',r'{\1}',a).format(**d)
'a2cdef7hi10klmno16'
或者您可以使用lambda
:
>>> re.sub(r'\[\s?(.*?)\s?\]', lambda m: str(d[m.group(1)]), a)
'a2cdef7hi10klmno16'
lambda
解决方案似乎要快得多:
>>> from timeit import timeit
>>>
>>> setup = """
... import re
... a = 'a[b]cdef[g ]hi[ j]klmno[ p ]'
... d = {'b':2,'g':7,'j':10,'p':16}
... """
>>>
>>> timeit(r"re.sub(r'\[\s?(.*?)\s?\]',r'{\1}',a).format(**d)", setup)
13.796708106994629
>>> timeit(r"re.sub(r'\[\s?(.*?)\s?\]', lambda m: str(d[m.group(1)]), a)", setup)
6.593755006790161
答案 1 :(得分:0)
newstring = [(d[i] if i in d else i) for i in string]
re.sub(r'\[\s?(.*?)\s?\]',r'\1',a)
这应该做你想要的,首先替换字符,然后删除括号,假设字典的值也是字符串。如果没有,只需用str(d [i])替换d [i]。
答案 2 :(得分:0)
Python正则表达式替换函数可以使用任意替换函数替换为:
import re
d = {'b': 2, 'g': 7, 'j': 10, 'p': 16}
def repl_fn(matchobj):
return str(d[matchobj.group(0)])
regex = re.compile('[' + ''.join(d.iterkeys()) + ']')
print regex.sub(repl_fn, 'abcdefghijklmnop')
答案 3 :(得分:0)
正则表达我不确定。但你可以这样做。
a = 'a[b]cdef[g ]hi[ j]klmno[ p ]'
result = re.sub(r'\[\s?(.*?)\s?\]',r'\1',a)
newresult = result
for char in result:
value = d.get(char)
if value:
newresult = re.sub(char, value, newresult)
print newresult