2016-01-06 79 views
1

我有一大組字符串,並且希望提取每個字符串的某個部分。每個字符串包含一個子字符串是這樣的:在Python中提取部分長字符串的最快方法

my_token:[ 
    "key_of_interest" 
], 

這是它說my_token每個字符串的一部分。我正在考慮獲取'my_token:['''的結尾索引位置,然後獲取'']的開始索引位置,並獲取這兩個索引位置之間的所有文本。

有沒有更好或更有效的方法來做到這一點?我會這樣做的字符串的長度〜10,000和大小100,000的集。

編輯:該文件是一個.ion文件。根據我的理解,它可以被視爲一個平面文件 - 因爲它是基於文本的,用於描述元數據。

+0

如果字符串是JSON,請使用'json.loads'並在分析的對象上訪問它,不要嘗試將它作爲字符串進行分片。 – Amadan

+1

假設這是唯一一次在每個字符串中出現my_token的情況下,沒有額外的約束(比如'它可能在字符串的後半部分'),那麼您尋找哪種效率提升?我認爲使用正則表達式可以通過爲周圍字符制定正則表達式來簡單地捕獲「key_of_interest」,而不是在算法上有重要意義的程度,可以獲得邊際效率提升。 –

+1

@Amadan爲什麼會更有效率?如果字符串已經在內存中,並且他不需要字符串的任何其他部分,是不是隻是增加了將字符串加載到單獨對象中的開銷? –

回答

1

的基本要求,顯示了通過,當你澄清:

我在想得到的結束索引位置「my_token:‘‘和得到的開頭索引位置後’’],」和獲取這兩個索引位置之間的所有文本。

這聽起來像是你試圖避免正確的做法:使用任何語言的字符串解析器

除非您有興趣編寫yet another parsing framework,否則沒有充分的理由直接在字符串基元上進行解析。

因此,請使用由處理您之前問題的人編寫的庫。

  • 如果是JSON,請使用standard library json module;同上,如果它是Python標準庫中已有的解析器的其他語言。
  • 如果是其他一些廣泛實施的標準:獲取已存在的第三方Python庫知道如何正確解析。
  • 如果尚未實現:使用pyparsing或其他一些知名實體庫編寫自定義分析器。

所以爲了讓你需要知道什麼是數據格式(這是不是「什麼是文件名」回答一個不錯的選擇;相反,你需要知道什麼是對的數據格式這些文件的內容)。然後,您將能夠搜索知道該數據格式的解析器庫。

+0

該文件是一個.ion文件。你會建議使用pyparsing嗎? – MW2015

1

這怎麼可能做到「最蠢最簡單的方式」?

  • 找到起始位置
  • 旁觀的結束位置
  • 抓住一切罔兩

這確實是你在做什麼之間。因此,任何進一步的改進只能來自每一步的優化。可能的方法包括:

  • 縮小搜索區域(需要額外的約束/假設按照comment56995056
  • 加快搜索操作位,其包括:
    • 從格式 提取原始數據
      • 你已經完全忽略了格式 - 所以你必須確保永遠不會有任何不正確的解析(例如,你的搜索條件嵌入到其他地方的字符串或匹配令牌的一部分),按照comment56995034
    • 基本圖案比較操作
      • 不太可能在純Python實現自str.index是用C語言實現早已和實現是可能已經一樣簡單都不可能
0

嘛,前面已經提到 - 一個解析器似乎是最好的選擇。

但回答你的問題沒有所有額外的建議......如果你只是看速度,解析器並不是真正做到這一點的最佳方法。更快的方法是你已經有這樣的字符串將使用正則表達式。

matches = re.match(r"my_token:\[\s*"(.*)"\s*\]\.",str) 
key_of_interest = matches.groups()[0] 

還有其他問題出現。例如,如果您的鑰匙內有",該怎麼辦?嚴格的JSON會自動在那裏使用一個轉義字符,這也將被正則表達式捕獲。因此這太複雜了。

而JSON本身不是正則表達式可分析的(is-json-a-regular-language)。所以,請自擔風險使用。但是,通過適當的限制和假設,正則表達式比json解析器要快。

+0

該文件不是JSON文件。這是一個.ion文件。 – MW2015

+0

這很有趣。我從來沒有聽說過.ion文件。你能給出完整的表單或它被用於什麼嗎? – AbdealiJK

相關問題