如何通过python中的正则表达式替换/修改模式?

时间:2019-06-26 20:44:10

标签: python regex

假设我要修改脚本中的所有模式,以一行为例:

line = "assert Solution().oddEvenList(genNode([2,1,3,5,6,4,7])) == genNode([2,3,6,7,1,5,4]), 'Example 2'"

请注意,函数genNode使用List[int]作为参数。我想要的是删除列表,并将所有整数保留在列表中,以便该函数实际上使用*nums作为参数。

期望:

line = "assert Solution().oddEvenList(genNode(2,1,3,5,6,4,7)) == genNode(2,3,6,7,1,5,4), 'Example 2'"

我提出了一种re模式

r"([g][e][n][N][o][d][e][(])([[][0-9\,\s]*[]])([)])"

但是我不确定如何使用它……我无法使用re.sub,因为它需要我用固定的字符串替换。

我如何达到我想要的结果?

2 个答案:

答案 0 :(得分:1)

您可以这样做:

re.sub(r'(genNode\()\[([^]]+)\]', r'\1\2', line)
  • (genNode\()genNode(匹配,并将其放入捕获的组1
  • \[与文字[匹配
  • ([^]]+)匹配下一个],并将其放入捕获的组2
  • \]与文字]匹配

在替换中,我们仅使用捕获的组,即删除了[]


您可以通过使用零宽度正向后看来匹配第一个捕获的组,以匹配[之前的部分:

re.sub(r'(?<=genNode\()\[([^]]+)\]', r'\1', line)

示例:

In [444]: line = "assert Solution().oddEvenList(genNode([2,1,3,5,6,4,7])) == genNode([2,3,6,7,1,5,4]), 'Example 2'"                                                                                         

In [445]: re.sub(r'(genNode\()\[([^]]+)\]', r'\1\2', line)                                                                                                                                                  
Out[445]: "assert Solution().oddEvenList(genNode(2,1,3,5,6,4,7)) == genNode(2,3,6,7,1,5,4), 'Example 2'"

In [446]: re.sub(r'(?<=genNode\()\[([^]]+)\]', r'\1', line)                                                                                                                                                 
Out[446]: "assert Solution().oddEvenList(genNode(2,1,3,5,6,4,7)) == genNode(2,3,6,7,1,5,4), 'Example 2'"

FWIW,使用典型的非贪婪模式.*?代替[^]]+也可以:

re.sub(r'(?<=genNode\()\[(.*?)\]', r'\1', line)

答案 1 :(得分:1)

您可以写[g][e][n][N][o][d][e][(]而不是写getNode\(

您当前使用的[0-9\,\s]*字符类与列表中的任何字符匹配0倍以上,例如也可以仅匹配逗号,并且不能确保用逗号分隔数字。

要匹配逗号分隔符整数,可以将1个以上的数字与一个重复的组匹配以匹配一个逗号和1个以上的数字。

最后,使用正向前行来声明右括号或将其捕获到第3组中,并将其用于替换中。

使用此模式时,请使用r'\1\2作为替代。

(genNode\()\[(\d+(?:,\d+)*)\](?=\))

说明

  • (genNode\()在与genNode(相匹配的组1中捕获
  • \[匹配[
  • (捕获组2
    • \d+(?:,\d+)*匹配1+个数字并重复0+次逗号和1+个数字(也支持单个数字)
  • )关闭第2组
  • \]匹配]
  • (?=\))正向前进,断言右边是右括号)

Python demo | Regex demo

例如

import re

regex = r"(genNode\()\[(\d+(?:,\d+)*)\](?=\))"
line = "assert Solution().oddEvenList(genNode([2,1,3,5,6,4,7])) == genNode([2,3,6,7,1,5,4]), 'Example 2'"
result = re.sub(regex, r"\1\2", line)

if result:
    print (result)

结果

assert Solution().oddEvenList(genNode(2,1,3,5,6,4,7)) == genNode(2,3,6,7,1,5,4), 'Example 2'