1

我正在寻找按字母顺序排序的字符串列表和使用 python 的正则表达式之间的匹配项。

正则表达式比较简单,类似“block_number_[0-9]+”,表示“block_number_”后跟任何表示数字的字符串,例如“block_number_1234”。

除了字母排序之外,列表中的字符串几乎没有结构;它还包含“block_number_alt567”和“block_no_90210”等条目。

有没有一种方法可以测试我何时通过了字符串列表中不再可能与我的正则表达式匹配的点,即一旦我点击 block_number_alt567,就无需测试与“block_number_ [0 -9]+" ?

(最终目标是将相对较长的字符串列表与捕获列表中所有变体的正则表达式列表进行比较;不必每次都搜索字符串列表的每个元素所节省的性能在应用程序中将是显着的环境)。

4

3 回答 3

2

正则表达式的好处在于您可以使用一个正则表达式来匹配多种模式。以下正则表达式匹配您的所有示例模式。

block_n(o|(um(ber)?))_\w*\d+
于 2013-10-25T20:08:30.273 回答
0

如果您的列表已排序并且您正在尝试解析条目集,您还可以读取其中的数据(假设您的存储空间足够),然后进行二进制搜索以更有效地找到您的块,而无需单独处理每一行。

例如,如果您有如下列表:

block_no_0001
block_no_0023
< n random sorted block_no_ entries>
block_no_9451
block_number_0451
block_number_1582
< m random sorted block_number_... entries>
block_number_9825
block_number_alt1234

然后将文件中的所有条目读入列表:

list = []
file = open('mytestfile.txt', 'r')
for line in file.readlines()
    list.append(line)
listlen = len(list)

然后,您可以使用二进制搜索来搜索列表,以查找所有条目的上限和下限,而无需尝试匹配每一行。然后只需以不同的方式处理块集,而不必分别匹配索引之间的所有条目。

因此,例如,您最终会将某些内容存储在可能看起来像这样的字典中:

{'block_number[0-9]{0,3}': 
     {'high': 450, 'low': 119}, 
 'block_no[\\w+][0-9]{0,3}': 
     {'high': 452, 'low': 451}, 
 'block_no[0-9]{0,3}': 
     {'high': 118, 'low': 0}
 }

然后,您可以将每个字典条目从“低”到“高”并根据需要进行处理。

于 2013-10-25T21:20:30.093 回答
0

您可以使用 < 和 > 按字母顺序比较 Python 字符串。例如,"block_number_0" < "block_number_alt567"是 True。

如果我对您的理解正确,那么您可以停止查看正则表达式是否不匹配并且字符串大于“block_number_0”(或任何其他数字)。

于 2013-10-25T20:13:12.117 回答