我正在尝试替换单个字母的每个实例,后跟一个=号,然后替换一个在=和字母之间带有空格的字母。因此h=e
将被h = e
取代。这就是我现在所拥有的:
definition = 'h=e'
definition = re.sub(r"\w=\w", r"\w\s=\s\w", definition)
但这产生\w\s=\s\w
而不是h = e
。我在做什么错了?
答案 0 :(得分:3)
替换项不应是其他正则表达式,而应是普通字符串(或函数)。
https://docs.python.org/3/library/re.html#re.sub
re.sub(pattern, repl, string, count=0, flags=0)
返回通过用替换repl替换字符串中最左边的不重叠模式所获得的字符串。如果找不到该模式,则字符串将保持不变。 repl可以是字符串或函数
例如:
definition = 'h=e'
definition = re.sub(r"(\w)=(\w)", "\g<1> = \g<2>", definition)
print(definition)
但是在这里使用单词边界会更容易:
definition = 'h=e'
definition = re.sub(r"\b=\b", " = ", definition)
print(definition)
答案 1 :(得分:1)
您可以避免消耗掉不想替换的字符串部分,但仍可以通过使用lookahead / lookbehind断言来断言字符串周围的部分是否匹配。
>>> re.sub(r"(?<=\w)=(?=\w)", " = ", "h=e")
'h = e'
您可以在其中放置任何模式。例如
>>> re.sub(r"(?<=x)=(?=y)", " = ", "y=z z=q y=x x=y a=b")
'y=z z=q y=x x = y a=b'
答案 2 :(得分:0)
更改
re.sub(r"\w=\w", r"\w\s=\s\w", definition)
到
re.sub(r'(\w)=(\w)', r"\g<1> = \g<2>", definition)
答案 3 :(得分:0)
re.sub
的文档特别提到了
诸如
\&
之类的未知转义字符被单独保留。
替换中需要一个文字空间。 \s
在那里毫无意义。您还需要向表达式中添加组,以捕获您不想要替换的部分替换部分:
后向引用(例如
\6
)被模式中第6组匹配的子字符串替换。
您的替换内容应如下所示:
definition = re.sub(r"(\w)=(\w)", r"\1 = \2", definition)