用列表中的项目替换子字符串

时间:2019-06-29 16:51:19

标签: python regex string replace

基本上,我有一个包含多个双空格的字符串,如下所示:

"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替换为点的第二个元素,依此类推。

3 个答案:

答案 0 :(得分:1)

如果我们仍在使用re.sub(),则可以采用以下基本模式的一种解决方案:

  1. 获取下一个标点符号。
  2. 仅替换该字符在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?