如何批量修改前引号?有人能指导一下吗?

我的文本中很多词语的前引号都错成了后引号,如何批量把错误的前引号都改成正确的前引号?
以下为样本:

例④用的是第一种含义,例⑤用的是第二种含义。
”自述”与”自诉”区别在于意义侧重方面及适用对象不同。“自述”义重在”述”,就是自叙,即自己陈说,适用对象就是自己的经历;”自诉”义重在”诉”,是诉说、诉讼,适用对象多是痛苦或冤屈的事情。从语法特点上看,”自述”可以用作名词,“自诉”没有名词意义。“自诉”的构词能力比“自述”强,多用于”自诉人”、“自诉书”、”自诉案件”等词语。

用以下几种方法试过,并不能解决这个问题。
import re

打开文件

with open(r’C:\a.txt’, ‘r’, encoding=‘utf-8’) as file:
content = file.read()

替换错误的前引号为正确的前引号,仅替换前引号前面不是空格的情况

content = re.sub(r’(?<!\s)”', ‘“’, content)

将修改后的内容写回文件

with open(r’D:\桌面\字典制作\113.txt’, ‘w’, encoding=‘utf-8’) as file:
file.write(content)这段代码中,我们使用了正则表达式 (?<!\s)” 来匹配前引号,但仅在前面不是空格的情况下进行替换。这样就可以避免替换掉正确的前引号和后引号。

打开文件

with open(r’C:\a.txt’, ‘r’, encoding=‘utf-8’) as file:
content = file.read()

替换错误的前引号为正确的前引号,仅替换前引号前面不是空格的情况

content = content.replace(‘”’, ‘“’, content.count(‘”’) - content.count(‘“’))

将修改后的内容写回文件

with open(r’D:\桌面\字典制作\113.txt’, ‘w’, encoding=‘utf-8’) as file:
file.write(content)

def main():
    oldString = "你的”原内”容das”fasdf”as"
    newString = ""
    isLeft = True
    for i in oldString:
        if i == '”':
            if isLeft:
                newString += '“'
                isLeft = False
            else:
                newString += i
                isLeft = True
        else:
            newString += i
    return newString

你这个方法是 GPT 写的吗?看起来有点像。

你给的例子前后引号前面都是非空格字符,因此它的解答没用。实际上正则表达式是有局限性的,像这个例子,匹配引号,正则就不是很好的方法。实际上据我所知,正则连匹配对应的括号都无法做到,更何况这种相同符号的例子。

楼上那个就是比较常用的解决方案,按顺序依次匹配,适用于比较普遍的情况,当然也有极端失效的情况。如果你的样本全为一种引号那可以一试我看到你的例子有两种引号了,那还是全换成一种引号再弄吧。

不过正则倒也不是不行,下面有一个解决方案,需要保证全文均为「”」:

”([^”]+?)”
“\1”

只要不出现需要转换成「““””」的应该就没什么大问题。


def main():
    oldString = "你的”原内”容das”fasdf”as"
    newString = ""
    isLeft = True
    for i in oldString:
        if i == '”' or i == '“':
            if isLeft:
                newString += '“'
                isLeft = False
            else:
                newString += '”'
                isLeft = True
        else:
            newString += i
    return newString

改写了 2 楼的代码,应该就能在不统一引号的前提实现了。

[quote=“PilgrimLyieu, post:3, topic:23856”]

def main():
    oldString = "你的”原内”容das”fasdf”as"
    newString = ""
    isLeft = True
    for i in oldString:
        if i == '”' or i == '“':
            if isLeft:
                newString += '“'
                isLeft = False
            else:
                newString += '”'
                isLeft = True
        else:
            newString += i
    return newString

多谢!!
我都是GPT出来的东西,你写的这个我也不会用啊 :smiling_face_with_tear: 咋把原文件弄进来啊。

直接用文本编辑器,先把所有引号都替换成前引号,然后正则匹配连续的前引号,修改第二个引号为后引号。

正则替换写法:

from re import sub

results = []

# 你的内容放同目录的 input.txt 中
with open("input.txt", "r", encoding = "utf-8") as f:
    lines = f.readlines()
    for line in lines:
        result = sub(r"”([^”]+?)”", r"“\1”", line.replace("“", "”"))
        results.append(result)

# 结果会输出到同目录的 output.txt 中
with open("output.txt", "w", encoding = "utf-8") as f:
    f.write(''.join(results))

非正则写法:

results = []

def convert(oldString):
    newString = ""
    isLeft = True
    for i in oldString:
        if i == '”' or i == '“':
            if isLeft:
                newString += '“'
                isLeft = False
            else:
                newString += '”'
                isLeft = True
        else:
            newString += i
    return newString

# 你的内容放同目录的 input.txt 中
with open("input.txt", "r", encoding = "utf-8") as f:
    lines = f.readlines()
    for line in lines:
        results.append(convert(line))

# 结果会输出到同目录的 output.txt 中
with open("output.txt", "w", encoding = "utf-8") as f:
    f.write(''.join(results))

或者像楼上说的那样直接用文本编辑器,比如 VSCode,全局替换引号,然后正则替换就好了。

代码可能写的不太好,但我测试了一下应该能用。


  1. Python 文件输入输出可以参考: 7. 输入与输出 — Python 3.12.0 文档
  2. Python 正则表达式可以参考: re — 正则表达式操作 — Python 3.12.0 文档

from re import sub

results =

你的内容放同目录的 input.txt 中

with open(r’C:\a.txt’, ‘r’, encoding=‘utf-8’) as f:
lines = f.readlines()
for line in lines:
result = sub(r"”([^”]+?)”“, r”“\1”“, line.replace(”“", “””))
results.append(result)

结果会输出到同目录的 output.txt 中

with open(r’D:\桌面\字典制作\113.txt’, ‘w’, encoding=‘utf-8’) as f:
f.write(result)
这个脚本运行无输出。
第二种非正则写法运行完美,太感谢了。保存以后这种问题就可以解决了。

有点奇怪,我这里是能正常运行的。两个代码唯一区别就是处理引号逻辑不同。

另外代码可以像下面这样放置,看起来会清晰一些:

```<代码类型,如 python>
<代码>
```

例如:

```python
from re import sub

results = []

# 你的内容放同目录的 input.txt 中
with open("input.txt", "r", encoding = "utf-8") as f:
    lines = f.readlines()
    for line in lines:
        result = sub(r"”([^”]+?)”", r"“\1”", line.replace("“", "”"))
        results.append(result)

# 结果会输出到同目录的 output.txt 中
with open("output.txt", "w", encoding = "utf-8") as f:
    f.write(''.join(results))
```

不过问题解决了就好。:laughing:

我又检查了一遍,第一个代码在输出端好像我写错了,这次运行完美。你的这两个脚本都完美。多谢。

就是把路径后面的一个逗号打成了全角导致了错误,对比检查了好多次才发现,不认真看真看不出来。