2011-01-12 1 views
3

Мне нужно найти довольно длинную строку для кодов CPV (обычных закупок).Наиболее эффективный способ определения подстроки в строке в python?

на данный момент я делаю это с простым циклом и str.find()

проблема, если код КНДА был перечислен в несколько ином формате, этот алгоритм не найдешь Это.

Каков наиболее эффективный способ поиска всех различных итераций кода внутри строки? Это просто случай переформатирования каждого из 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'] 

(Изменить пока он не совпадет с CPVs в данных тесно.)

1

Попробуйте использовать любого из функций в re (регулярных выражениях для Python). См. the docs для получения дополнительной информации.

Вы можете создать регулярное выражение, чтобы принять несколько разных форматов для этих кодов, а затем использовать re.findall или что-то подобное для извлечения информации. Я не уверен, что такое КНД так я не регулярное выражение для него (хотя, может быть, вы могли бы увидеть, если Google имеет какие-либо?)

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'. –

+0

@larsman: Благодарю вас, я изменил его на необработанную строку и переупорядочил список символов для более легкого понимания. –

 Смежные вопросы

  • Нет связанных вопросов^_^