Python正则表达式模块中的Posix类

3

我安装了Python 3.4.3的模块regex(不是re!)仅仅是为了能够使用POSIX类,例如[:graph:]。但是,它们似乎无法正常工作。

import regex

sentence = "I like math, I divided ÷ the power ³ by ¾"

sentence = regex.sub("[^[:graph:]\s]","",sentence)

print(sentence)

输出: 我喜欢数学,我用³的力量除以¾

期望输出: 我喜欢数学,我除以了幂指数

PCRE中它是有效的。那么我错过了什么?


尝试使用 sentence = regex.sub(r"(?V1)[^[:graph:]\s]","",sentence) - Wiktor Stribiżew
3
如果说有什么问题的话,我认为是 PCRE 做错了。[:graph:] 应该匹配任何可见字符,但 PCRE 只计算 ASCII 字符。regex 库处理 POSIX 字符类时是完全支持 Unicode 的,除了一些似乎限制在原始 POSIX 定义中的 POSIX 字符类。(在您提供的链接中搜索“POSIX 字符类”即可了解详情。) - Alan Moore
它在我的Windows上的Python2.7上运行良好(使用regex而不是re)[现在正在检查Python3]。 - tmrlvi
@vks 的评论确实是最好的。你能把它发表为答案吗?我很乐意接受。 - Bram Vanroy
@vks 已点赞并接受 :) - Bram Vanroy
显示剩余4条评论
2个回答

1

尝试 sentence = regex.sub("[^[:graph:]\s]","",sentence,flags=regex.VERSION1)

您需要添加 flag regex.VERSION1


1

我不确定regex模块,但是你可以通过以下方式获取结果

import re

sentence = "I like math, I divided ÷ the power ³ by ¾"

sentence = re.sub("[^\x21-\x7E\s]","",sentence)

print(sentence)

这里有一张漂亮的图表http://www.regular-expressions.info/posixbrackets.html,展示如何将POSIX类转换为ASCII,re模块可以理解。


1
我迟到了,但这个程序并没有按照预期工作。它还会删除一些特殊字符,比如é和à,而我并不希望这样。 - Bram Vanroy
只是想让你知道,即使字符被空格包围,这也不能解决问题: https://regex101.com/r/sM0yO2/1。我猜ASCII范围不包括特殊字母字符。 - Bram Vanroy
@BramVanroy:我已经对此进行了一些尝试。你能解释一下为什么[^\x21-\x7E\s][^[:graph:]\s]在你的情况下表现不同吗?对我来说,两者都会删除é和à。当我将\s移到方括号外面时,它停止删除它们,只是因为我在测试字符串末尾输入它们。https://regex101.com/r/sM0yO2/2和https://regex101.com/r/sM0yO2/3 - Joseph Stover
在R中,启用Unicode标志后它们的行为会发生变化。至少,这是我的测试结果。如果我有时间,我会为您发布一个测试案例。 - Bram Vanroy

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