假设我要修改脚本中的所有模式,以一行为例:
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
,因为它需要我用固定的字符串替换。
我如何达到我想要的结果?
答案 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组\]
匹配]
(?=\))
正向前进,断言右边是右括号)
例如
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'