使用re.sub

时间:2019-05-14 06:07:24

标签: python regex

我有一个字符串"F(foo)",我想用"F('foo')"替换该字符串。我知道我们也可以在第二个参数中使用正则表达式,并使用re.sub(r"F\(foo\)", r"F\('foo'\)",str)进行替换。但是这里的问题是,foo是一个动态字符串变量。每次我们要进行替换时,情况都会有所不同。是否可以通过某种正则表达式以更清洁的方式进行此类替换?

我记得一种使用()然后使用.group(1)提取foo的方法。但这需要我再定义一个临时变量以存储foo。我很好奇是否有一种方法可以用一行"F(foo)"替换"F('foo')"或换句话说以一种更简洁的方式替换

示例:

F(name)应该替换为F('name')F(id)应该替换为F('id')。 G(name)不应替换。 因此,正则表达式将是r"F\((\w)+\)"才能找到这样的字符串。

4 个答案:

答案 0 :(得分:2)

使用re.sub

例如:

import re

s = "F(foo)"
print(re.sub(r"\((.*)\)", r"('\1')", s))

输出:

F('foo')

答案 1 :(得分:0)

以下正则表达式将有效的[Python | C | Java]标识符用F括起来,并在括号中用单引号引起来:

re.sub(r"F\(([_a-z][_a-z0-9]+)\)", r"F('\1')", s, flags=re.I)
#"F('foo')"

答案 2 :(得分:0)

有几种方法,具体取决于foo是什么。 如果它不能包含(),则可以将(替换为(',将)替换为')。否则,请尝试使用

re.sub(r"F\((.*)\)", r"F('\1')", yourstring)

替换部分中的\1将引用搜索正则表达式中的(.*)捕获组

答案 3 :(得分:0)

在模式F\((\w)+\)中,您快到了,只需在+后面放置量词\w即可重复匹配1个以上的单词字符。

如果将其放在捕获组之后,请重复该组,这将为您提供捕获组中最后一次迭代的值,该值将是foo中的第二个o

您可以将表达式更新为:

F\((\w+)\)

在替换中,使用\1

指代捕获组
F('\1')

例如:

import re
str = "F(foo)"
print(re.sub(r"F\((\w+)\)", r"F('\1')", str)) # F('foo')

Python demo