【问题标题】:How to pass a backreference to a function [duplicate]如何将反向引用传递给函数[重复]
【发布时间】:2022-01-08 07:12:30
【问题描述】:

我有以下工作正常:

sql = 'SELECT id, date, instance_id FROM sales_1m'
print (re.sub(r'\b(%s)\b' % '|'.join(source.ns_mapping.keys()), r'\1', sql))
# SELECT id, date, instance_id FROM sales_1m

但是,一旦我尝试将反向引用传递给函数,它就会产生以下内容:

print (source.ns_mapping)
# {'data': '__SHADOW__test.data', 'test.data': '__SHADOW__test.data', 'data2': '__SHADOW__test.data2', 'test.data2': '__SHADOW__test.data2', 'sales_1m': '__SHADOW__test.sales_1m', 'test.sales_1m': '__SHADOW__test.sales_1m', 'season': '__SHADOW__test.season', 'test.season': '__SHADOW__test.season', 'team': '__SHADOW__test.team', 'test.team': '__SHADOW__test.team'}
print (re.sub(r'\b(%s)\b' % '|'.join(source.ns_mapping.keys()),
        source.ns_mapping[r'\1'], sql))

KeyError: '\1'

就好像它在捕获反向引用之前调用函数一样。我将如何解决这个问题?

我的目标是在替换后得到这个:

SELECT id, date, instance_id FROM __SHADOW__test.sales_1m

【问题讨论】:

  • 你想完成什么? source.ns_mapping[r'\1'] 显然是抛出异常,因为没有 \1
  • @Francisco 将反向引用的值传递给函数。
  • @Francisco 即在调用函数之前解析反向引用。现在我只是在做re.findall 并遍历这些值,但我想知道re.sub 是否可以将反向引用值传递给一个函数(因此是问题)。

标签: python regex


【解决方案1】:

re.sub 的第二个参数可以带一个函数,所以你可以这样做:

>>> re.sub(r'\b(%s)\b' % '|'.join(ns_mapping.keys()), lambda x: ns_mapping[x.group()], sql)
'SELECT id, date, instance_id FROM __SHADOW__test.sales_1m'

【讨论】:

    猜你喜欢
    • 2014-07-16
    • 1970-01-01
    • 2018-10-15
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多