Python中的正则表达式替换:将命名组转换为整数

4

在替换字符串中的模式时,
我需要特别获取匹配命名组的整数/长整型值。

以下是一个示例及我尝试过的方法:

status = {1:'foo', 23:'bar'}
re.sub(
    '<status>(?P<id>\d+)',
    status.get(int(r'\g<id>')), # ValueError: invalid literal for int() with base 10: '\\g<id>'
    # status.get(int(r'\g<id>'.decode())), # ValueError: invalid literal for int() with base 10: '\\g<id>'
    # status.get('%d' % r'\g<id>'), # %d format: a number is required, not str
    'Tom ran: from <status>1 to <status>23')

普通的类型转换可以很好地处理原始字符串int(r'22'),但是在上面的情况下不起作用?


它的哪个方面不起作用?请提供一个完整且正确的示例。http://sscce.org/ - Marcin
我现在已经添加了上述问题中所有尝试的错误。谢谢。 - Pratyush
2
问题在于,正则表达式替换中没有魔法。像r'\g<id>'这样的东西只是普通字符串,它们实际上包含一个反斜杠、一个'g'和一对尖括号。re.sub()方法内部有解析这些字符串的代码。如果你试图在它到达re.sub()之前将该字符串传递给其他东西(比如int()),那么int()会看到带有反斜杠、g和尖括号的字面字符串,并且不知道如何处理它。这就是为什么需要使用lambda形式,就像thg435所演示的那样。 - Mark Reed
啊哈!用简单的话解释得很好。 - Pratyush
1个回答

10
这对您应该有效:
re.sub(
    '<status>(?P<id>\d+)',
    lambda m: status.get(int(m.group('id'))),
    'Tom ran: from <status>1 to <status>23')

如果repl是一个函数,它将被用于每个非重叠的pattern匹配。该函数接收一个单一的match对象参数,并返回替换字符串。@http://docs.python.org/library/re.html#re.sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接