我的代码似乎无法正常运行:

x = "engniu4nwi5u"
print re.sub(r"\D(\d)\D", r"\1abc", x)


我想要的输出是:engniuabcnwiabcu
但是实际给出的输出是:engni4abcw5abc

最佳答案

您正在分组错误的字符,必须将其写为

>>> x = "engniu4nwi5u"
>>> re.sub(r"(\D)\d(\D)", r"\1abc\2", x)
'engniuabcnwiabcu'



(\D)匹配一个非数字并在\1中捕获它
\d匹配数字
(\D)匹配以下数字。在\2中捕获


它如何匹配?

engniu4nwi5u
     |
    \D => \1

engniu4nwi5u
      |
     \d

engniu4nwi5u
       |
      \D => \2


另一种解决方案

您也可以使用环顾四周

>>> x = "engniu4nwi5u"
>>> re.sub(r"(?<=\D)\d(?=\D)", r"abc", x)
'engniuabcnwiabcu'



(?<=\D)回顾断言。检查数字是否以非数字开头。但不是人为
\d匹配数字
(?=\D)预先声明。检查数字后面是否跟有非数字。也没有被捕获。

09-07 19:23