2

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

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

但是,我不能简单地拥有subbe的替换部分,d['\1']因为会有一个KeyError: '\x01'.

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

4

4 回答 4

4

您可以使用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
于 2013-08-12T00:03:21.920 回答
0
newstring = [(d[i] if i in d else i) for i in string]
re.sub(r'\[\s?(.*?)\s?\]',r'\1',a)

假设字典的值也是字符串,这应该通过首先替换字符然后删除括号来完成您想要的操作。如果不是,只需将 d[i] 替换为 str(d[i])。

于 2013-08-12T00:01:49.127 回答
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')
于 2013-08-12T00:04:53.717 回答
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
于 2013-08-12T00:05:02.990 回答