我在交换之前替换空格 - 工作,但是 - 非常不优雅的代码:
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标记之前简单地去除每个空格 - 这也会起作用......
答案 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
,因为它是第一个也是唯一一个组。