使用Python的re.sub正则表达式来替换字符串

3

我想在Java代码中查找并替换以下代码片段。

::[Node1]N81:157-->::[Node1]N81[157]
::[Node1]B81:72/0-->::[Node1]B81[72].0

157、72和0可能是动态的,可能有其他值。

我有一些模式可以找到我的表达式,但不知道是否可以改进。不管怎样,我不知道如何替换,我只知道如下找到模式的方法:

re.sub("::\[Node1]N[0-9]+:[0-9]+",'here I should put how to replace' , s)       
re.sub("::\[Node1]B[0-9]+:[0-9]+/[0-9]+",'here I should put how to replace' , s)
3个回答

1
使用捕获组:
>>> re.sub(r'::\[Node1]B(\d+):(\d+)/(\d+)', r'::[Node1]B\1[\2].\3', s)
'::[Node1]B81[72].0'

例如,使用表达式B...正常工作,但使用表达式N...时,工作方式如下: ::[Node1]N81:45 而不是 ::[Node1]N81[45]。谢谢。 - Jmm86

1

一些要点:

  1. 我想转义 '[' 和 ']' 符号
  2. 使用 /d 代替 [0-9]
  3. 我也喜欢尽可能具体,所以使用 {m,n} 来指定长度
  4. 最后,请查看 this 进行组替换

简而言之,请尝试以下代码:

print(re.sub("(::\[Node1\]N\d{2}):(\d{2,3})", "\g<1>[\g<2>]", s))
print(re.sub("(::\[Node1\]B\d{2}):(\d{2,3})/(\d{1})", "\g<1>[\g<2>].\g<3>", s))

1
你可以使用反向引用来解决你的问题。以下是如何使用re.sub来解决你的问题 -
In [1]: a = '::[Node1]N81:157'

In [2]: re.sub('::\[Node1\]N81:(?P<br1>[0-9]+)', '::[Node1]N81:[\g<br1>]', a)
Out[2]: '::[Node1]N81:[157]'


In [3]: b = '::[Node1]B81:72/0'

In [4]: re.sub('::\[Node1\]B81:(?P<br1>[0-9]+)/(?P<br2>[0-9]+)', '::[Node1]B81[\g<br1>].\g<br2>', b)
Out[4]: '::[Node1]B81[72].0'

(?P<br1>[0-9]+) - 这将给定的组(括号中的内容)标记为br1。

\g<br1> - 这有助于使用其名称引用br1组。

有关语法的更多信息,请参阅官方文档 - re.sub


1
我会查看一下后向引用。谢谢。 - Jmm86

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