【问题标题】:Why is "\p{L}" not working in this regex?为什么“\p{L}”在这个正则表达式中不起作用?
【发布时间】:2015-12-06 12:04:49
【问题描述】:

操作系统:Windows 7。Jython 2.7.0“最终版本”。

for token in sorted_cased.keys():
    freq = sorted_cased[ token ]
    if freq > 1:
        print( 'token |%s| unicode? %s' % ( token, isinstance( token, unicode ), ) )
        if re.search( ur'\p{L}+', token ):
            print( '  # cased token |%s| freq %d' % ( token, freq, ))

sorted_cased 是一个显示令牌出现频率的字典。在这里,我试图清除频率 > 1 的单词(仅限 unicode 字符)。(注意,我使用的是re.match 而不是search,但search 应该检测到事件1,例如\p{L} token)

样本输出:

token |Management| unicode? True
token |n| unicode? True
token |identifiés| unicode? True
token |décrites| unicode? True
token |agissant| unicode? True
token |tout| unicode? True
token |sociétés| unicode? True

没有人认识到它有一个 [p{L}]。我尝试了各种排列方式:双引号、添加 flags=re.UNICODE 等。

稍后 我被要求解释为什么不能将其归类为 How to implement \p{L} in python regex 的重复项。可以,但是...其他问题的答案并没有引起人们注意使用 REGEX MODULE (旧版本?非常新版本?注意它们是不同的)而不是 RE 模块。为了保存毛囊和未来遇到这个问题的人的理智,我要求允许保留本段,尽管问题是“欺骗”。

我也尝试安装 Pypi 正则表达式模块 在 JYTHON 下失败(使用 pip)。使用 java.util.regex 可能更好。

【问题讨论】:

标签: python regex unicode jython


【解决方案1】:

如果您可以访问 Java java.util.regex,最好的选择是使用内置的 \p{L} 类。

Python(包括 Jython 方言)不支持 \p{L} 和其他 Unicode 类别类。也不是 POSIX 字符类。

另一种选择是限制\w 类,如(?![\d_])\w 并使用UNICODE 标志。 If UNICODE is set, this \w will match the characters [0-9_] plus whatever is classified as alphanumeric in the Unicode character properties database.。这种替代方案有一个缺陷:它不能在字符类中使用。

另一个想法是使用[^\W\d_](带有re.U标志)将匹配任何不是非单词(\W)、数字(\d)和_字符的字符。它将有效地匹配任何 Unicode 字母

【讨论】:

  • 谢谢...但是...!我刚刚意识到我安装 Pypi 正则表达式模块的尝试失败了。这可能是因为我使用的是 Jython 而不是 CPython。 Jythonistas 可能需要在这一点上承认“pythonic 失败”并改用 Java 类:java.util.regex
  • Java 的正则表达式模块通过\p 语法支持所有POSIX 类,您可以在那里使用\pP 而不是\p{P}
  • 实际上,(?![\d_])\w 构造没有缺陷,因为您实际上可以在\w 部分中包含更多内容,并在前瞻部分中排除更多内容。没有什么能阻止你这样做。
猜你喜欢
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
相关资源
最近更新 更多