如何在Python中用正则表达式替换/修改模式?

Cod*_*755 5 python regex

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

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

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

期待:

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

我想出了一个re模式

r"([g][e][n][N][o][d][e][(])([[][0-9\,\s]*[]])([)])"
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用它......我无法开始re.sub工作,因为它要求我用固定字符串替换。

我怎样才能达到我想要的结果?

hee*_*ayl 2

你可以做:

re.sub(r'(genNode\()\[([^]]+)\]', r'\1\2', line)
Run Code Online (Sandbox Code Playgroud)
  • (genNode\()匹配genNode(并将其放入捕获的组 1
  • \[匹配字面意思[
  • ([^]]+)匹配到下一个],并将其放入捕获的组 2 中
  • \]匹配字面意思]

在替换中,我们仅使用捕获的组,即丢弃[]


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

re.sub(r'(?<=genNode\()\[([^]]+)\]', r'\1', line)
Run Code Online (Sandbox Code Playgroud)

例子:

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'"
Run Code Online (Sandbox Code Playgroud)

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

re.sub(r'(?<=genNode\()\[(.*?)\]', r'\1', line)
Run Code Online (Sandbox Code Playgroud)