基本的Python正则表达式

时间:2018-07-21 04:16:06

标签: python regex

我正在尝试替换单个字母的每个实例,后跟一个=号,然后替换一个在=和字母之间带有空格的字母。因此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。我在做什么错了?

4 个答案:

答案 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)