python - 如何将 Python 中的所有 unicode 小写字符与正则表达式匹配?

标签 python python-3.x regex unicode python-re

我正在尝试编写一个匹配 Python 3 中的 Unicode 小写字符的正则表达式。我正在使用 re 库。例如,re.findall(some_pattern, 'u∏ñKθ') 应该返回 ['u', 'ñ', 'θ']

在 Sublime Text 中,我可以简单地输入 [[:lower:]] 来查找这些字符。

我知道 Python 可以使用 re.compile('[^\W\d_]') 匹配任何 Unicode 字符,但我特别需要区分大写和小写。我也知道 re.compile('[a-z]') 将匹配任何 ASCII 小写字符,但我的数据是 UTF-8,它包含许多非 ASCII 字符——我检查了.

这是否可以在 Python 3 中使用正则表达式,或者我需要采取其他方法吗?我知道其他方法可以做到这一点。我只是希望使用正则表达式。

最佳答案

您可以使用 regex module支持 POSIX 字符类:

import regex 

>>> regex.findall('[[:lower:]]', 'u∏ñKθ')
['u', 'ñ', 'θ']

或者,使用 Unicode Category Class \p{Ll}\p{Lowercase_Letter}:

>>> regex.findall(r'\p{Ll}', 'u∏ñKθ')
['u', 'ñ', 'θ']

或者直接使用 Python 的字符串逻辑:

>>> [c for c in 'u∏ñKθ' if c.islower()]
['u', 'ñ', 'θ']

在任何一种情况下,都要小心这样的字符串:

>>> s2='\u0061\u0300\u00E0'
>>> s2
'àà'

第一个grapheme 'à''a''̀' 的组合字符的结果,其中第二个 'à' 是该特定代码点的结果。如果您在此处使用字符类,它将匹配 'a' 而不是组合重音:

>>> regex.findall('[[:lower:]]', s2)
['a', 'à']
>>> [c for c in s2 if c.islower()]
['a', 'à']

要解决这个问题,您需要使用更复杂的正则表达式模式或 normalize the string :

>>> regex.findall('[[:lower:]]', unicodedata.normalize('NFC',s2))
['à', 'à']

或按字形循环字形:

>>> [c for c in regex.findall(r'\X', s2) if c.islower()]
['à', 'à']

关于python - 如何将 Python 中的所有 unicode 小写字符与正则表达式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68428413/

相关文章:

python - 将数据从一行移动到一组指定行中的另一行

python - 如何将带有数字的数据转换为包含列表列表的字典?

python - 如何使用 gpython 脚本从 sample.tar.gz 文件中提取选定的文件

html - 使用正则表达式删除 <a href > 标签

regex - 正则表达式的两个部分中的字符数相同

java - 通过 Google Cloud Dataflow 编写服务

python - 我想使用 PyQt5 制作计算器机器人,但出现错误

python - 向条形图添加图像注释

python-3.x - 基于 Python Polars 列的更新不起作用

python - 在数据框的每一行中搜索时,如何从关键字列表中获取匹配的关键字?