2013-10-25 88 views
1

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

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

除了按字母顺序排序,列表中的字符串结构非常少,它还包含诸如“block_number_alt567”和“block_no_90210”之类的条目。

有没有一种方法可以测试我何时通过了我的字符串列表中不再可能与我的正则表达式匹配的点,即,一旦我点击block_number_alt567,就不需要测试任何更多匹配“block_number_ [0-9] +”? (最终目标是将比较长的字符串列表与捕获列表中所有变体的正则表达式列表进行比较;不会每次搜索字符串列表中的每个元素都会节省性能)在应用环境中很重要)。

回答

2

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

block_n(o|(um(ber)?))_\w*\d+ 
+0

谢谢你,我从来不会想到我自己。不过,我也有这样的情况,即在确定匹配之后不同的字符串变体需要不同的处理,所以我确实需要根据正则表达式列表进行搜索。 – NaiveBayesian

+0

如果您需要不同的处理,那么是的,您必须将您的字符串与正则表的列表进行匹配以控制您的流程。你的文件是否只包含'number_block ...'字符串,还是需要从周围的文本中提取? –

+0

它们不需要提取,每个字符串在ASCII文件中已经是单行。正则表达式也通过文本文件输入;设计目标是编写一个python脚本,我可以将其分发给其他人,他们可以在其中输入自己的正则表达式,脚本会将用户输入与字符串列表进行比较。 – NaiveBayesian

0

您可以按字母顺序比较Python字符串与<和>。例如,"block_number_0" < "block_number_alt567"为真。

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

+0

这是否意味着我必须手动确定并为列表中的每个正则表达式添加“最小”匹配模式,或者可以自动确定最小匹配? – NaiveBayesian

+0

我以为这只是这个单一的正则表达式,对不起。我想不出一个真正通用的简单方法来找到匹配模式的例子。是否所有正则表达式都以固定部分开头(如“block_number_”)?在这种情况下,你可以对正则表达式本身进行排序,一个停止匹配的地方就是下一个匹配的地方。 – RemcoGerlich

+0

没问题;我保持狭义的范围,确保我清楚地表达自己。我拥有的字符串列表是一团糟,应该将这些东西组合在一起,通常具有不同的语法。认为“50acre_number_of_cows”和“bovine_count_hundred_acres”是两种可能性。 python脚本的工作是将字符串列表与手动组成的正则表达式列表进行比较,并提取相关系列中的所有内容。最终,除我之外的其他用户应该能够编写自己的正则表,并让所有事情都能够顺利进行! – NaiveBayesian

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} 
} 

然后,您可以通过刚刚从每一个“低”到“高”的字典条目的打击和处理如所须。

相关问题