【问题标题】:Python Regex Sub: Using Dictionary with Regex ExpressionsPython Regex Sub:将字典与正则表达式一起使用
【发布时间】:2018-01-03 21:11:21
【问题描述】:

我正在使用包含正则表达式的字典来替换不同字符串的部分,正如@roippi 在a previous SO question 中优雅地描述的那样。第一个 're.sub' 表达式完美运行。但是,只要我的代码实际上涉及正则表达式(第二个“re.sub”表达式),替换就不起作用。

我很困惑为什么会这样。我已经尝试使用和取出“r”以及合并前瞻/后视表达式,但似乎没有任何效果。任何帮助将不胜感激!

test_dict = {r'(\d+)': 'THIS IS A NUMBER', 'john_doe':'THIS IS A NAME'}

re.sub('(john_doe)', lambda x: test_dict.get(x.group(1),x.group(1)),'john_doe_jr')

re.sub(r'(\d+)', lambda x: test_dict.get(x.group(1), x.group(1)), '999la')

【问题讨论】:

  • <(\d+)> 模式与 999la 中的任何内容都不匹配
  • 在理解这实现了什么方面遇到了问题。需要解释一下吗?
  • 您好@WiktorStribiżew,感谢您的回复。我错误地添加了已删除的 html 标签。但是,这个表达式现在应该可以工作了(我已经在 Pythex 中尝试过,它很好),但在使用“re.sub”表达式时它仍然不能工作。有什么想法吗?
  • 正则表达式匹配999,变成x.group(1)999 不是test_dict 中的键,这会导致.get 方法返回999,将999 替换为999

标签: regex python-3.x dictionary substitution


【解决方案1】:

match.group(n) 不返回用于匹配第 n 组的正则表达式,而是返回第 n 组本身。

因此,lambda 返回 test_dict.get('999', '999'),后者返回 '999',因为 '999' 不是字典中的键。

您可以遍历字典的键并检查是否有任何键与您的捕获组匹配,然后 然后 替换它,但这具有 O(n) 时间复杂度(在字典的大小中) )。

def replacement(match, d, group=1):
    for key in d:
        if re.match(key, match.group(group)):
            return d[key]
    return match.group(group)

re.sub(r'(\d+)', lambda x: replacement(x, test_dict), '999la')

【讨论】:

  • 这个功能完美解决了我的困境!!非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-02-02
  • 2015-12-18
  • 2016-12-29
  • 2011-06-19
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多