繁体   English   中英

python正则表达式替换匹配字符串的一部分

[英]python regular expression replacing part of a matched string

我有一个看起来像这样的字符串

"myFunc('element','node','elementVersion','ext',12,0,0)"

我目前正在检查使用的有效性,效果很好

myFunc\((.+?)\,(.+?)\,(.+?)\,(.+?)\,(.+?)\,(.+?)\,(.+?)\)

现在我想替换第三个参数中的任何字符串。 不幸的是,我不能只在第三个位置的任何子字符串上使用 stringreplace,因为相同的“子字符串”可能位于该字符串中的任何其他位置。

有了这个和一个 re.findall,

myFunc\(.+?\,.+?\,(.+?)\,.+?\,.+?\,.+?\,.+?\)

我能够在第 3 个位置获取子字符串的内容,但是 re.sub 不替换字符串它只是返回我想替换的字符串:/

这是我的代码

myRe = re.compile(r"myFunc\(.+?\,.+?\,(.+?)\,.+?\,.+?\,.+?\,.+?\)")
val =   "myFunc('element','node','elementVersion','ext',12,0,0)"

print myRe.findall(val)
print myRe.sub("noVersion",val)

知道我错过了什么吗?

谢谢! 塞伯

在 re.sub 中,您需要为整个匹配字符串指定替换。 这意味着您需要重复您不想更换的零件。 这有效:

myRe = re.compile(r"(myFunc\(.+?\,.+?\,)(.+?)(\,.+?\,.+?\,.+?\,.+?\))")
print myRe.sub(r'\1"noversion"\3', val)

如果您唯一的工具是锤子,那么所有问题看起来都像钉子。 正则表达式是一把强大的锤子,但不是每项任务的最佳工具。

有些任务最好由解析器处理。 在这种情况下,字符串中的参数列表就像一个 Python 元组,所以你可以作弊:使用 Python 内置解析器:

>>> strdata = "myFunc('element','node','elementVersion','ext',12,0,0)"
>>> args = re.search(r'\(([^\)]+)\)', strdata).group(1)
>>> eval(args)
('element', 'node', 'elementVersion', 'ext', 12, 0, 0)

如果你不能相信输入ast.literal_eval比 eval 更安全。 一旦你解构了字符串中的参数列表,我想你可以弄清楚如何在需要时再次操作和重新组装它。

阅读文档: re.sub返回字符串的副本,其中每个出现的整个模式都被替换。 它在任何情况下都不能修改原始字符串,因为 Python 字符串是不可变的。

尝试使用前瞻和后视断言来构造一个只匹配元素本身的正则表达式:

myRe = re.compile(r"(?<=myFunc\(.+?\,.+?\,)(.+?)(?=\,.+?\,.+?\,.+?\,.+?\))")

您是否尝试过使用命名组? http://docs.python.org/howto/regex.html#search-and-replace

希望这能让您只针对第 3 场比赛。

如果您想在不使用正则表达式的情况下执行此操作:

>>> s = "myFunc('element','node','elementVersion','ext',12,0,0)"
>>> l = s.split(",")
>>> l[2]="'noVersion'"
>>> s = ",".join(l)
>>> s
"myFunc('element','node','noVersion','ext',12,0,0)"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM