【问题标题】:What is the correct way to use unicode characters in a python regex在 python 正则表达式中使用 unicode 字符的正确方法是什么
【发布时间】:2013-09-30 19:29:05
【问题描述】:

在使用 Python 2.7 抓取一些文档的过程中,我遇到了一些烦人的页面分隔符,我决定将其删除。分隔符使用一些时髦的字符。我已经问了一个问题here,关于如何让这些字符显示它们的 utf-8 代码。使用了两个非 ASCII 字符:'\xc2\xad''\x0c'。现在,我只需要删除这些字符,以及一些空格和页码。

Elsewhere 在 SO 上,我看到 unicode 字符与正则表达式一起使用,但它的格式很奇怪,我没有这些字符,例如'\u00ab'。此外,它们都没有使用 ASCII 以及非 ASCII 字符。最后,python 文档对正则表达式中的 unicode 主题非常了解......关于标志的一些东西......我不知道。有人可以帮忙吗?

这是我目前的用法,它没有达到我想要的效果:

re.sub('\\xc2\\xad\s\d+\s\\xc2\\xad\s\\x0c', '', my_str)

【问题讨论】:

  • 我想将您指向Joeldeceze 会有所帮助
  • 以前读过乔尔。那么我是否应该推断我遇到的困难只是我对 unicode 是什么的困惑?
  • 可以的。您能否更准确地描述您的输入(例如 repr(my_str) 说什么)?
  • 好的,它似乎是一个 utf8 编码的字节字符串。因此,您的选择是 1)逐字替换该字符串中的 bytes 或 2)将其转换为 unicode 并替换 characters
  • 注意那里的零宽度空格!

标签: python regex unicode utf-8


【解决方案1】:

您可以删除所有想要的内容,而不是寻找特定的不需要的字符:

re.sub('[^\\s!-~]', '', my_str)

这会丢弃所有字符:

  • 空白(空格、制表符、换行符等)
  • 可打印的“普通”ascii 字符(! 是第一个可打印的字符,~ 是最后一个小数点 128)

如果需要,您可以包含更多字符 - 只需调整字符类。

【讨论】:

  • 这很聪明。唯一的问题是所谓的“软连字符”“-”被反复使用,并且是我用于捕获数据的正则表达式的一部分。同时,这也是我希望删除的部分内容。有时,OCR 技术会插入看起来像“– 9 –\x0c”的分页符。通常,在我尝试捕获的数据之间会发现中断。不过,有时它会出现在句子的中间。因此,我只是在寻找特定的实例......
  • 不过,也许我可以对文档进行初步扫描,并将所有“-”实例替换为“--”。这也将转换我现在尝试删除的特定实例。我也可以删除 '\x0c' 的所有实例,然后我有一个简单的纯 1 字节正则表达式来处理,并回避 unicode 正则表达式。
【解决方案2】:

我有同样的问题,我知道这不是有效的方式,但在我的情况下工作

 result = re.sub(r"\\" ,",x,x",result)
 result = re.sub(r",x,xu00ad" ,"",result)
 result = re.sub(r",x,xu" ,"\\u",result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多