【问题标题】:python regex re.sub delete space before commapython regex re.sub 删除逗号前的空格
【发布时间】:2019-01-28 11:42:29
【问题描述】:

我正在尝试制作一个小文本清洁程序,并且为此目标制作了一系列 re.subs。这是我要清理的凌乱字符串:

'当我尝试这个时,逗号不会向左移动,而句号会。另外,理想情况下,新句子的第一个字母会大写。'

import csv, re
with open('spaties.csv', 'r', newline='') as readFile:
reader = csv.reader(readFile)

    with open('spaties3.csv', 'w', newline='') as new_file:
    writer = csv.writer(new_file)

    for line in reader:
        writer.writerow(line)

        #delete duplicate spaces
        ver1 = [re.sub("\s+", " ", x) for x in line]
        writer.writerow(ver1)

        #insert space after .
        ver2 = [re.sub(r'(?<=[.])(?=[^\s])', r' ', x) for x in ver1]
        writer.writerow(ver2)

        #sentence start with uppercase
        ver3 = [re.sub(r'(\.\s[a-z])', lambda pat: pat.group(1).upper(), x) for x in ver2]
        writer.writerow(ver3)

        ver4 = [re.sub("ipv", "i.p.v.", x) for x in ver3]
        writer.writerow(ver4)

        #remove space before .
        ver5 = [re.sub(r'\s([?.!"](?:\s|$))', r'\1', x) for x in ver4]
        writer.writerow(ver5)

        #first letter uppercase
        ver6 = [re.sub(r'(^[a-z])', lambda pat: pat.group(1).upper(), x) for x in ver5]
        writer.writerow(ver6)

        #insert space after ,
        ver7 = [re.sub(r'(?<=[,])(?=[^\s])', r' ', x) for x in ver6]
        writer.writerow(ver7)

        #remove space before ,
        ver8 = [re.sub(r'\s([?,!"](?:\s|$))', r'\1', x) for x in ver7]
        writer.writerow(ver8)

    new_file.close()

这是我得到的最后一个输出:

'当我尝试这个时,逗号不会向左移动,而句号会。此外,理想情况下,新句子的第一个字母大写。'

所以它确实正确移动了重复的空格,将句子的第一个字母大写,但是:

  • 它没有在逗号后插入空格 (ver7)
  • 也没有删除逗号前的空格 (ver8)。
  • 此外,它已经大写了“而”。

逗号问题让我很困惑,因为第 7 版和第 8 版与第 2 版和第 5 版完全相同。

提前致谢!

【问题讨论】:

    标签: python regex


    【解决方案1】:

    我认为你把事情复杂化了。您可以删除句号、逗号、问号或感叹号之前的所有空格,并使用此正则表达式在它们之后插入一个:

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

    它只是查找.,!? 中的一个,其两边有一些空格(可能是0),然后用\1(\1 后跟一个空格)替换它,从而删除之前的所有空格然后用一个空格替换所有空格。

    Demo at regex101

    【讨论】:

    • 感谢您的回复。看起来不错,我唯一注意到的是它用终端括号中的一种问号替换了 [.,!?] 字符。在 csv 中,它看起来像一个 []。为什么会这样?
    • 可能您正在替换为无效字符而不是空字符串。我猜你输入了'\1',它会产生一个控制-A 字符。
    • @tripleee 谢谢你。我已经编辑了答案,希望能更清楚地说明替换字符串是什么。
    • 感谢两位。在括号中的所有字符中,只有逗号不起作用。这可能与分隔符是 csv 文件中的逗号有关吗?
    • @robbah 是的 - 可能就是这样。如果没有替换逗号,则您尝试清理的字符串似乎在逗号上被拆分,因此正在处理的值中没有任何值。也许您需要更改 quotechar 以确保字符串以单个值结束。
    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2011-06-21
    • 1970-01-01
    • 2020-09-28
    • 2016-05-24
    相关资源
    最近更新 更多