【问题标题】:python: replacing a regular character with an unicode one using regex re.subpython:使用正则表达式 re.sub 用 unicode 替换常规字符
【发布时间】:2017-07-10 12:50:13
【问题描述】:

我有一个简单的问题让我发疯,似乎是由于在 python 中处理unicode 字符。

我的磁盘上存储了latex 表(与http://www.jwe.cc/downloads/table.tex 非常相似),我想在其上应用一些正则表达式,以便连字符- (\u2212) 被短划线@987654326 替换@(alt 0150\u2013

我正在使用以下函数来执行两种不同的正则表达式和替换。

import re
import glob

def mychanger(fileName):
  with open(fileName,'r') as file:
    str = file.read()
    str = str.decode("utf-8")
    str = re.sub(r"((?:^|[^{])\d+)\u2212(\d+[^}])","\\1\u2013\\2", str).encode("utf-8")
    str = re.sub(r"(^|[^0-9])\u2212(\d+)","\\1\u2013\\2", str).encode("utf-8")
  with open(fileName,'wb') as file:
    file.write(str)

myfile = glob.glob("C://*.tex")
for file in myfile: mychanger(file)  

不幸的是,这并没有改变任何东西。

如果我使用非 unicode 字符(如 $ 而不是 \u2013),它仍然有效,这意味着正则表达式代码是正确的。

我迷路了,我尝试使用re.sub(ur"((?:^|[^{])\d+)\u2212(\d+[^}])","\\1\u2013\\2", str).encode("utf-8"),但它仍然没有改变任何东西。

这里有什么问题?谢谢!

【问题讨论】:

  • 试试:u"\\1\u2013\\2"
  • Noobie,你为什么要传递一个列表?您在此处发布的代码似乎不是您正在运行的代码。
  • 只有在所有替换完成后才尝试对字符串进行编码。
  • DashPunctuation 连字符减号是 - (\u002D) 不同于 MathSymbol 减号 (\u2212)。
  • Python 2.x 还是 3.x?

标签: python regex unicode character-encoding


【解决方案1】:

您的示例文件实际上包含 HYPHEN-MINUS (U+002D) 而不是 U+2212。

即使它确实包含正确的字符,您也会遇到 Python 2.x Unicode 的所有 n00b 问题:

  1. 内联解码和编码。实际上你编码了两次!
  2. 在 Unicode 字符串中使用 Unicode 文字 (\u2212)
  3. 不必要地使用 r 原始修饰符

我的建议是删除所有解码和编码,让 Python 为您完成。 io 模块向后移植 Python 3.x 行为并为您解码文件。我还将 str 重命名为 my_str 以避免与 Python 自己的 str 类发生冲突。

import re
import glob
import io

def mychanger(fileName):
    with io.open(fileName,'r', encoding="utf-8") as file:
        my_str = file.read()

        my_str = re.sub(u"((?:^|[^{])\d+)\u002d(\d+[^}])", u"\\1\u2013\\2", my_str)
        my_str = re.sub(u"(^|[^0-9])\u002d(\d+)",          u"\\1\u2013\\2", my_str)

    with io.open(fileName, 'w', encoding="utf-8") as file:
        file.write(my_str)

myfile = glob.glob(C://*.tex")

for file in myfile: mychanger(file)

有关 Python 2.x 和 Unicode 的详细说明,请参阅How to fix: "UnicodeDecodeError: 'ascii' codec can't decode byte"

【讨论】:

  • 谢谢!有点道理我遇到了你不认为的菜鸟问题:D
  • 当你复制粘贴代码时,这在 Python 2 中是不可避免的 :) 哦,当名字合适的时候 ;)
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 2017-12-13
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多