【问题标题】:Python - Replace regular expression match with a matching pair valuePython - 用匹配的对值替换正则表达式匹配
【发布时间】:2018-08-07 18:45:50
【问题描述】:

假设我有一个与运行时可用的 5 位代码相关联的别名列表:

aliasPairs = [(12345,'bob'),(23456,'jon'),(34567,'jack'),(45678,'jill'),(89012,'steph')]

我想找一种简洁的表达方式:将行中的id替换为匹配的别名,例如:

line = "hey there 12345!"
line = re.sub('\d{5}', value in the aliasPairs which matches the ID, line)
print line

应该输出:

hey there bob!

Python 专业人士如何以简洁的方式编写枚举表达式?

感谢和欢呼!

【问题讨论】:

  • 那么每五位代码对应一个别名?考虑使用字典。
  • @Kevin 也可以,但是可扩展的数据结构并不重要,因为我最多只能有大约 10-15 个硬编码别名。我更想知道如何在 Python 中做 lambdas 之类的。
  • Python 没有用于在关联列表中查找的内置函数,这就是您需要字典的原因。 dict(aliasPairs) 将为您构建字典。

标签: python regex enumeration


【解决方案1】:

当您对两类数据(例如五位代码和别名)进行一对一映射时,请考虑使用字典。然后很容易访问任何特定的别名,给定它的代码:

import re

aliases = {
    "12345":"bob",
    "23456":"jon",
    "34567":"jack",
    "45678":"jill",
    "89012":"steph"
}

line = "hey there 12345!"
line = re.sub('\d{5}', lambda v: aliases[v.group()], line)
print(line)

结果:

hey there bob!

【讨论】:

  • 太棒了,我非常喜欢 lambda 调用。
【解决方案2】:

如果您将在代码中直接使用这些别名(不仅仅是从数据结构中引用),那么Enum 是一个不错的选择1

from enum import Enum

class Alias(Enum):
    bob = 12345
    jon = 23456
    jack = 34567
    jill = 45678
    steph = 89012

然后使用re 看起来像:

line = "hey there 12345!"
line = re.sub('\d{5}', lambda v: Alias(int(v.group()).name, line)

您也可以使用以下方法将该行为直接添加到Alias Enum

    @classmethod
    def sub(cls, line):
        return re.sub('\d{5}', lambda v: cls(int(v.group())).name, line)

并在使用中:

Alias.sub("hey there 12345!")

当然,"bob" 可能应该大写,但谁想要 Alias.Bob 整个代码?最好将替换文本与 Enum 成员名称分开,使用 aenum2 更容易完成这项工作:

from aenum import Enum
import re

class Alias(Enum):
    _init_ = 'value text'
    bob = 12345, 'Bob'
    jon = 23456, 'Jon'
    jack = 34567, 'Jack'
    jill = 45678, 'Jill'
    steph = 89012, 'Steph'
    @classmethod
    def sub(cls, line):
        return re.sub('\d{5}', lambda v: cls(int(v.group())).text, line)

Alias.sub('hey there 34567!')

1参见this answer,了解标准Enum 用法。

2 披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum) 库的作者。

【讨论】:

  • 这是对枚举的一个非常酷的使用。问题:Alias.sub 调用看起来有点像对类 Alias 的静态访问调用,init 是否在我第一次调用 Alias.sub 方法时或在每次调用时调用“上课”?
  • @Rice:在Enum 类中,所有Enum 成员(也称为类实例)都是在创建类本身时创建的; __new____init__ 都在那个时候被调用。任何返回 Enum 成员的未来操作都将返回已创建的成员之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2014-05-12
  • 2022-08-10
  • 2022-11-29
  • 2016-11-04
  • 2012-09-19
  • 2013-12-06
相关资源
最近更新 更多