如何从正则表达式类中获取可匹配的字符列表

5

给定一个正则表达式字符类/集合,在Python 3中如何获取所有可匹配的字符列表。例如:

[\dA-C]

应该给予

['0','1','2','3','4','5','6','7','8','9','A','B','C']

我无法理解您的问题。您能否在问题中提供样例输入和所需输出? - Moinuddin Quadri
2
这个问题涉及到匿名样本输入,例如[\dA-C]和样本输出,例如['0','1','2','3','4','5','6','7','8','9','A','B','C']?这个问题太宽泛了,但并不是完全不清楚。 - jonrsharpe
这是一个有趣的问题。你的目标是什么? - Flint
那么一个完整的解决方案并不是非常实际的。如果我只写 [\w],答案将是大多数 Unicode 字符集。如果您可以将兴趣限制在特定的代码点范围内,那么您就可以有所收获。 - alexis
1
不在Unicode世界中 - 尝试使用希伯来语单词!\d也不仅仅是[0-9],请看我的答案。 - alexis
显示剩余3条评论
3个回答

8
我认为你需要的是string.printable,它可以返回Python中所有可打印字符。例如:
>>> import string
>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'

现在,要检查是否满足您的正则表达式的内容,您可以执行以下操作:

>>> import re
>>> x = string.printable
>>> pattern = r'[\dA-C]'
>>> print(re.findall(pattern, x))
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C']

string.printable是由数字、字母、标点符号和空格组成的。还可以查看String Constants以获取string模块提供的所有常量的完整列表。


如果您需要所有unicode字符的列表,可以执行以下操作:

import sys
unicode_list = [chr(i) for i in range(sys.maxunicode)]

注意:这将是一个巨大的列表,控制台可能会卡住一段时间才能给出sys.maxunicode的值作为结果。

>>> sys.maxunicode
1114111

如果您正在处理一些特定的Unicode格式,请参考Unicode字符范围以限制您感兴趣的范围。


2
只要我们关心的是ASCII,那么这是一个不错的解决方案——否则它会在[é]上失败。 - alexis
我还需要包括希伯来字母、非断空格等Unicode字符。 - o17t H1H' S'k
猜我会用这个:x = ''.join([chr(i) for i in range(2000)]) - o17t H1H' S'k
1
@eyaler:更新了答案以返回所有Unicode字符的列表,但请注意阅读注释部分。 - Moinuddin Quadri

3
import re

x = '123456789ABCDE'
pattern = r'[\dA-C]'
print(re.findall(pattern,x))    
#prints ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C']

这是您要找的内容吗?

如果您没有 x,并且只想匹配ASCII字符,可以使用:

import re
import string

x = string.ascii_uppercase + string.digits
pattern = r'[\dA-C]'
print(re.findall(pattern,x))    

如果您想为模式输入数据,只需执行以下操作:

 pattern = input() #with either one from above

3
您可能希望直接从正则表达式中提取它们,但事实并非如此简单:请考虑像`\S`这样的规范,它不匹配一系列连续的字符,还有否定规范如`[^abc\d]`,以及像`(?![aeiou])\w`这样的好东西(它匹配除了给定的五个元音字母之外的任何单个字母)。因此,对于您的正则表达式,最简单的方法是尝试将每个候选字符与其匹配。
但是检查所有Unicode代码点是不太实用的,这既因为测试的数量很大,也因为结果可能是一个非常大的列表:一个字符类正则表达式可能包含像`\w`这样的规范,可以匹配来自整个Unicode表的大量字符。或者它可能包含一个否定规范,例如`[^abc\d]`,它甚至可以匹配更多。因此,让我们假设您可以将兴趣限制在特定的Unicode范围内。在参考Unicode范围表之后,您可能会决定,以示例为例,您对[0000-024F](基本和扩展拉丁文)和[0590-074F](希伯来文和阿拉伯文)范围感兴趣。
您可以遍历这些Unicode代码点,检查哪些被正则表达式匹配。
import re

myregexp = r"[\dA-C]"
interest = [ (0x0000, 0x024F),
             (0x0590, 0x06FF) ]


pattern = re.compile(myregexp)
matched = []    
for low, high in interest:
    matched.extend(chr(p) for p in range(low, high+1) if pattern.match(chr(p)))

>>> print("".join(matched))
0123456789ABC٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹

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