基本上,我有一个包含多个双空格的字符串,如下所示:
"Some text\s\sWhy is there no punctuation\s\s"
我还有一个标点符号列表,这些标点符号应替换双空格,以便输出为:
puncts = ['.', '?']
# applying some function
# output:
>>> "Some text. Why is there no punctuation?"
我尝试了re.sub(' +', puncts[i], text)
,但是这里的问题是我不知道如何正确地遍历列表,并用puncts中的第一个元素替换第一个double-whitespace,将第二个double-whitespace替换为点的第二个元素,依此类推。
答案 0 :(得分:1)
如果我们仍在使用re.sub(),则可以采用以下基本模式的一种解决方案:
text
中的第一个匹配项。puncts = ['.', '?']
text = "Some text Why is there no punctuation "
for i in puncts:
text = re.sub('\s(?=\s)', i, text, 1)
对re.sub()的调用返回一个字符串,基本上说“找到所有两个空白字符系列,但仅将第一个空白字符替换为标点符号”。最后一个参数“ 1”使之成为仅替换双重空格的第一个实例,而不是全部替换(默认行为)。
如果正向查找(正则表达式中我们要匹配但不替换的部分)使您感到困惑,那么您也可以不使用它:
puncts = ['.', '?']
text = "Some text Why is there no punctuation "
for i in puncts:
text = re.sub('\s\s', i + " ", text, 1)
这将产生相同的输出。
句子的末尾会有一个空白,但是如果您对此感到小气,可以使用简单的text.rstrip()
来解决。
进一步的解释
您第一次尝试使用正则表达式' +'
无效,因为该正则表达式匹配至少有一个空格的所有实例-也就是说,它将匹配所有内容,然后也将所有内容替换为标点符号。上述解决方案在其各自的正则表达式中考虑了双空格。
答案 1 :(得分:0)
您只需使用replace
方法就可以做到!
text = "Some text Why is there no punctuation "
puncts = ['.', '?']
for i in puncts:
text = text.replace(" ", i, 1) #notice the 1 here
print(text)
输出:Some text.Why is there no punctuation?
答案 2 :(得分:0)
您可以使用re.split()将字符串分成两个双倍空格之间的子字符串,并使用join插入标点符号:
import re
string = "Some text Why is there no punctuation "
iPunct = iter([". ","? "])
result = "".join(x+next(iPunct,"") for x in re.split(r"\s\s",string))
print(result)
# Some text. Why is there no punctuation?