2011-01-31 70 views
1

比方說,我有文字的,就像這樣一段話:文本解析設計

蝸牛可以在一個很寬 各種環境,包括 溝渠,沙漠和深海 深處找到的海。許多種蝸牛可以在淡水水域。 (source)

我有10,000條正則表達式規則來匹配可以重疊的文本。例如,正則表達式/Snails? can/i將找到兩個匹配項(在文本中用斜體表示)。正則表達式/can(also)? be/i有兩個匹配(粗體)。

通過我的正則表達式迭代和尋找比賽之後,有什麼用最好的數據結構,文本,鑑於一些地方,它返回mached這一切正則表達式?例如,如果我想要第1行的字符8(基於0,在can),我會得到前面描述的兩個正則表達式的匹配。

我可以創建一個HashMap(鍵:字符位置,值:設置所有匹配的正則表達式的)。這是最佳嗎?有沒有更好的方法來解析文本與成千上萬的正則表達式(不循環每一個)?

謝謝!

+0

你能評論一下這個更普遍的用法嗎?您將如何利用您希望存儲的數據? – Mikhail 2011-02-01 19:13:33

+0

用戶看到解析的文本,用匹配的正則表達式突出顯示。當用戶懸停在角色上時,會顯示匹配的正則表達式。 – ash 2011-02-02 21:54:45

回答

1

存儲所有在字典中會努力比賽,但將它意味着你必須對所有在內存中的匹配存儲在同一時間。如果你的數據足夠小,可以很容易地適應內存,不要擔心。只要做一些工作並繼續前進。

如果你需要減少你如何使用數據增長速度的內存使用量真的取決於。例如,如果您從開始到結束處理位置,則可以使用re.finditer來迭代處理所有正則表達式,而不是在需要的時間內維持額外的匹配。

1

我假設你的正則表達式不多個句子之間的交叉。在這種情況下,您可以

1) break your text into array of sentences 
2) for each sentence simply record which (id) regex have matched. 
3) when you would like to see the match - run the regex again. 

「存儲更少/計算更多」解決方案。