在Python正则表达式中正确使用Unicode字符的方法是什么?

3
在使用Python 2.7爬取某些文档时,我遇到了一些令人烦恼的页面分隔符,决定将其删除。这些分隔符使用了一些奇怪的字符。我已经在此 提问 如何使这些字符显示其utf-8代码。有两个非ASCII字符: '\xc2\xad''\x0c'。现在,我只需要删除这些字符,以及一些空格和页码。

StackOverflow上,我看到有人将Unicode字符与正则表达式一起使用,但它们的格式很奇怪,我没有这些字符,例如'\u00ab'。此外,没有人同时使用ASCII和非ASCII字符。最后,Python文档关于正则表达式中的Unicode内容很少...关于标志的内容...我不知道。有人能帮忙吗?

这是我的当前用法,它不能实现我想要的功能:

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

我想指向Joeldeceze可能会有所帮助。 - georg
之前读过Joel的文章。那么我应该推断出,我遇到的困难只是因为我对Unicode的概念混淆了吗? - Brian Peterson
4
好的,看起来这是一个UTF8编码的字节字符串。因此,您有两个选择:1)直接替换该字符串中的字节;2)将其转换为Unicode并替换字符。 - georg
1
注意那里的零宽空格! - Veedrac
我认为我已经通过my_str = my_str.decode('utf-8')将我的字符串转换为Unicode。问题只是出在我的正则表达式上吗?如果你的意思是这样,我可以匹配确切的Unicode转义字符。但是,既然我要切换到全转义正则表达式,那么中间的数字应该变成什么呢?还是'\d'吗? - Brian Peterson
显示剩余5条评论
2个回答

2

与其寻找特定的不需要的字符,你可以删除所有需要的内容:

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

这会丢弃所有不是以下字符的内容:
  • 空格(空格、制表符、换行符等)
  • 可打印的“正常”ascii字符(!是第一个可打印字符,~是最后一个在小于128的十进制下可打印的字符)
如果需要,可以包含更多字符-只需调整字符类别。

这很聪明。唯一的问题是所谓的“软连字号”“–”被反复使用,并且是捕获数据的正则表达式的一部分。同时,它也是我希望删除的内容之一。有时,OCR技术插入了看起来像“– 9 –\x0c”的分页符。通常,在我试图捕获的数据之间找到断点。不过,偶尔会在句子中间出现。因此,我只寻找特定的实例... - Brian Peterson
也许,我可以对文档进行初始扫描,并将所有的“-”替换为“--”。这也将转换我现在尝试删除的特定实例。我也可以放弃所有的“\x0c”实例,然后我就有一个简单而纯粹的1字节正则表达式来处理,并且避开了unicode正则表达式。 - Brian Peterson

0

我有同样的问题,我知道这不是高效的方法,但在我的情况下起作用了

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接