为什么 "\p{L}" 在这个正则表达式中不起作用?

mik*_*ent 2 python regex unicode jython

操作系统: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, ))
Run Code Online (Sandbox Code Playgroud)

sorted_cased是一个显示令牌出现频率的字典。这里我试图筛去话,其与频率发生(仅Unicode字符)> 1.(NB我使用了re.match而不是searchsearch应检测在事件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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Wik*_*żew 5

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

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

另一种选择是限制\w(?![\d_])\w并使用UNICODE标志。如果UNICODE设置,这\w将匹配字符 [0-9_] 加上在 Unicode 字符属性数据库中归类为字母数字的任何内容。. 这种替代方法有一个缺陷:它不能在字符类中使用。

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