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

时间:2017-12-12 15:05:45

标签: python regex python-3.x

我想在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 个答案:

答案 0 :(得分:1)

您可以使用backreferences来解决问题。以下是使用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 :(得分:1)

使用捕获组:

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

答案 2 :(得分:1)

一些观点:

  1. 我喜欢逃避'['和']'
  2. 使用/ d代替[0-9]
  3. 我也希望尽可能具体,因此{m,n}是特定长度的
  4. 最后,看一下this的群组替换
  5. 简而言之,请尝试以下代码:

    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))