2011-01-12 46 views
3

我需要爲CPV(共同採購詞彙)代碼搜索相當長的字符串。最有效的方法去確定python中的字符串中的子字符串?

此刻我與一個簡單的for循環和str.find()這樣

的問題是,如果CPV代碼已經在一個稍微不同的格式已經上市,該算法將無法找到它。

什麼是搜索字符串內代碼的所有不同迭代的最有效方法?是否僅僅是重新格式化每個最多10,000個CPV代碼併爲每個實例使用str.find()?

不同的格式的一個示例可以是如下

30124120-1 
301241201 
30124120 - 1 
30124120 1 
30124120.1 

謝謝:)

回答

4

嘗試正則表達式:

>>> cpv = re.compile(r'([0-9]+[-\. ]?[0-9])') 
>>> print cpv.findall('foo 30124120-1 bar 21966823.1 baz') 
['30124120-1', '21966823.1'] 

(修改直到它緊密地在您的數據的每次收看成本相匹配。)

1

嘗試使用任何的功能在re(正則表達式的Python)。有關更多信息,請參閱the docs

您可以制定一個正則表達式來接受這些代碼的許多不同格式,然後使用re.findall或類似的東西來提取信息。我不能確定什麼是CPV是,所以我沒有爲它的正則表達式(儘管也許你可以看到,如果谷歌有什麼?)

1
cpv = re.compile(r'(\d{8})(?:[ -.\t/\\]*)(\d{1}\b)') 

for m in re.finditer(cpv, ex): 
    cpval,chk = m.groups() 
    print("{0}-{1}".format(cpval,chk)) 

應用到您的樣本數據返回

30124120-1 
30124120-1 
30124120-1 
30124120-1 
30124120-1 

正則表達式可以讀作

(\d{8})   # eight digits 

(?:    # followed by a sequence which does not get returned 
    [ -.\t/\\]* # consisting of 0 or more 
)    # spaces, hyphens, periods, tabs, forward- or backslashes 

(\d{1}\b)  # followed by one digit, ending at a word boundary 
       # (ie whitespace or the end of the string) 

希望幫助!

+0

+1爲正常化。不過,我建議使用`r`字符串前綴來代替`\\\ t`。 – 2011-01-13 12:36:31

相關問題