如何将 Python 中的所有 unicode 小写字符与正则表达式匹配?
How do I match all unicode lowercase characters in Python with a regular expression?
我正在尝试编写一个正则表达式来匹配 Python 中的 Unicode 小写字符 3. 我正在使用 re
库。例如,re.findall(some_pattern, 'u∏ñKθ')
应该 return ['u', 'ñ', 'θ']
.
在 Sublime Text 中,我只需键入 [[:lower:]]
即可找到这些字符。
我知道 Python 可以匹配任何带有 re.compile('[^\W\d_]')
的 Unicode 字符,但我特别需要区分大写和小写。我也知道 re.compile('[a-z]')
会匹配任何 ASCII 小写字符,但我的数据是 UTF-8,它包含很多非 ASCII 字符——我检查过。
Python3 中的正则表达式是否可能,或者我是否需要采用替代方法?我知道其他方法。我只是希望使用正则表达式。
试试这个 -
import re
a = re.findall('[^\W\d_]', 'u∏ñKθ')
for i in a:
if i.islower():
print(i)
re.findall
找出所有的UTF-8字符,然后用.islower()
过滤掉,检查是否是小写字符,然后打印出来
如果可以使用第三方包,则可以使用 regex 包。
>>> import regex
>>> s = 'ABCabcÆæ'
>>> m = regex.findall(r'[[:lower:]]', s)
>>> m
['a', 'b', 'c', 'æ']
您可以使用支持 POSIX 字符的 regex module classes:
import regex
>>> regex.findall('[[:lower:]]', 'u∏ñKθ')
['u', 'ñ', 'θ']
或者,使用\p{Ll}
或\p{Lowercase_Letter}
的Unicode Category Class:
>>> 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'
与 '̀'
的组合字符的结果,其中第二个 'à'
是那个的结果具体代码点。如果您在这里使用字符 class,它将匹配 '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()]
['à', 'à']
您不需要使用 PyPi regex
库(尽管我强烈建议在这里使用它,因为它支持 POSIX 字符 类(如 [:lower:]
)和 Unicode 属性 类 像 \p{Ll}
):
import re, sys
lower = '[{}]'.format("".join([chr(i) for i in range(sys.maxunicode) if chr(i).islower()]))
print(re.findall(lower, 'ABCabcÆæóżźę'))
# => ['a', 'b', 'c', 'æ', 'ó', 'ż', 'ź', 'ę']
结果:
['a', 'b', 'c', 'æ', 'ó', 'ż', 'ź', 'ę']
我正在尝试编写一个正则表达式来匹配 Python 中的 Unicode 小写字符 3. 我正在使用 re
库。例如,re.findall(some_pattern, 'u∏ñKθ')
应该 return ['u', 'ñ', 'θ']
.
在 Sublime Text 中,我只需键入 [[:lower:]]
即可找到这些字符。
我知道 Python 可以匹配任何带有 re.compile('[^\W\d_]')
的 Unicode 字符,但我特别需要区分大写和小写。我也知道 re.compile('[a-z]')
会匹配任何 ASCII 小写字符,但我的数据是 UTF-8,它包含很多非 ASCII 字符——我检查过。
Python3 中的正则表达式是否可能,或者我是否需要采用替代方法?我知道其他方法。我只是希望使用正则表达式。
试试这个 -
import re
a = re.findall('[^\W\d_]', 'u∏ñKθ')
for i in a:
if i.islower():
print(i)
re.findall
找出所有的UTF-8字符,然后用.islower()
过滤掉,检查是否是小写字符,然后打印出来
如果可以使用第三方包,则可以使用 regex 包。
>>> import regex
>>> s = 'ABCabcÆæ'
>>> m = regex.findall(r'[[:lower:]]', s)
>>> m
['a', 'b', 'c', 'æ']
您可以使用支持 POSIX 字符的 regex module classes:
import regex
>>> regex.findall('[[:lower:]]', 'u∏ñKθ')
['u', 'ñ', 'θ']
或者,使用\p{Ll}
或\p{Lowercase_Letter}
的Unicode Category Class:
>>> 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'
与 '̀'
的组合字符的结果,其中第二个 'à'
是那个的结果具体代码点。如果您在这里使用字符 class,它将匹配 '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()]
['à', 'à']
您不需要使用 PyPi regex
库(尽管我强烈建议在这里使用它,因为它支持 POSIX 字符 类(如 [:lower:]
)和 Unicode 属性 类 像 \p{Ll}
):
import re, sys
lower = '[{}]'.format("".join([chr(i) for i in range(sys.maxunicode) if chr(i).islower()]))
print(re.findall(lower, 'ABCabcÆæóżźę'))
# => ['a', 'b', 'c', 'æ', 'ó', 'ż', 'ź', 'ę']
结果:
['a', 'b', 'c', 'æ', 'ó', 'ż', 'ź', 'ę']