字符串中的字符替换:如何使用正则表达式?

时间:2013-04-16 08:44:09

标签: python regex string

我在交换之前替换空格 - 工作,但是 - 非常不优雅的代码:

my_string = "There , are , many , wrong . spaces , before interpunction  marks !"

my_string.replace(" ,", ",").replace(" .", ".").replace(" !", "!").replace(" ?", "?")

现在我尝试提出一个更优雅的解决方案,即正则表达式。但我得到的只是:

import re
my_string = re.sub(r"[\s]+[,.!?]", XXX, my_string)

我只是不明白如何使 XXX 用相应的whitespace+mark替换每个mark。或者如何在ALL标记之前简单地去除每个空格 - 这也会起作用......

4 个答案:

答案 0 :(得分:2)

您想为标点符号创建捕获组,然后在替换表达式中引用该组:

re.sub(r'\s+([,.!?])', r'\1', my_string)

\s周围不需要括号;它已经是一个角色类。

演示:

>>> import re
>>> my_string = "There , are , many , wrong . spaces , before interpunction  marks !"
>>> re.sub(r'\s+([,.!?])', r'\1', my_string)
'There, are, many, wrong. spaces, before interpunction  marks!'

答案 1 :(得分:1)

您需要使用括号捕获标点符号,然后使用\1引用它:

import re
my_string = "There , are , many , wrong . spaces , before interpunction  marks !"
my_string = re.sub(r"[\s]+([,.!?])", r"\1", my_string)
print my_string  # There, are, many, wrong. spaces, before interpunction  marks!

答案 2 :(得分:0)

添加捕获组:

[\s]+([,.!?])

然后在替换中使用它:

\1

\ n指的是第n个捕获组,\ 0表示整个匹配。

答案 3 :(得分:0)

最后一行应该是这样的:

my_string = re.sub(r"\s+([,.!?])", r'\1', my_string)

模式部分中的paranthesises正在创建一个组,然后您引用该组\1,因为它是第一个也是唯一一个组。