[英]How to replace/modify a pattern by regular expression in python?
假设我想修改脚本中的所有模式,以一行为例:
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]
作为参数。 我想要的是删除List,并保持列表中的所有整数,以便该函数实际上将*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
工作,因为它需要我用固定的字符串替换。
我怎样才能达到理想的效果?
你可以做:
re.sub(r'(genNode\()\[([^]]+)\]', r'\1\2', line)
(genNode\\()
匹配genNode(
并将其放入捕获的组1中 \\[
匹配文字[
([^]]+)
匹配到下一个]
,并将其放入捕获的组2中 \\]
匹配文字]
在替换中,我们仅使用捕获的组,即丢弃[
和]
。
您可以通过使用零宽度正向lookbehind来匹配第一个捕获的组,以匹配[
:之前的部分:
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)
而不是写[g][e][n][N][o][d][e][(]
你可以写getNode\\(
您使用的当前字符类[0-9\\,\\s]*
匹配列出的任何列表的0+次,例如也可以仅匹配逗号,并且不确保存在逗号分隔的数字。
要匹配逗号分隔符整数,您可以将1+位与重复组匹配以匹配逗号和1+位。
最后使用正向前瞻来断言右括号或在第3组中捕获它并在替换中使用它。
使用此模式使用r'\\1\\2
作为替换。
(genNode\()\[(\d+(?:,\d+)*)\](?=\))
说明
(genNode\\()
捕获第1组匹配genNode(
\\[
匹配[
(
捕获第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'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.