使用字典进行Python正则表达式替换

时间:2013-08-11 23:57:09

标签: python regex dictionary

我有以下正则表达式来解析括号内的访问字符串并删除它们:

>>> 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'

是否有任何简单的方法可以使用字典替换正则表达式中的捕获字典?

4 个答案:

答案 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