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

2024-10-04 01:24:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

>>> a = 'a[b]cdef[g ]hi[ j]klmno[ p ]'
>>> re.sub(r'\[\s?(.*?)\s?\]',r'\1',a)
'abcdefghijklmnop'

但我想做的是把括号里的东西作为字典的目标。假设我有以下字典:

^{pr2}$

当我运行所需的regex时,它应该打印字符串:'a2cdef7hi10klmno16'

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

有没有简单的方法可以用响应regex中捕获的字典来替换模式?


Tags: 方法字符串re目标字典hiregex括号
3条回答
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])。在

Python regex replace函数可以使用任意替换函数替换为:

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

您可以使用^{},假设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

^{pr2}$

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

相关问题 更多 >