наиболее эффективный способ определения подстрок в строке в Python? - PullRequest
3 голосов
/ 12 января 2011

Мне нужно найти довольно длинную строку для кодов CPV (общий язык закупок).

В настоящее время я делаю это с помощью простого цикла for и str.find ()

проблема в том, что если код CPV был перечислен в несколько ином формате, этот алгоритм его не найдет.

Какой самый эффективный способ поиска всех различных итераций кода в строке?Это просто случай переформатирования каждого из до 10000 кодов CPV и использования str.find () для каждого экземпляра?

Примером другого форматирования может быть следующий

30124120-1 
301241201 
30124120 - 1
30124120 1
30124120.1

и т. д.

Спасибо:)

Ответы [ 3 ]

4 голосов
/ 12 января 2011

Попробуйте регулярное выражение:

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

(Изменяйте, пока оно не будет точно соответствовать CPV в ваших данных.)

1 голос
/ 13 января 2011
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)

Надеюсь, это поможет!

1 голос
/ 12 января 2011

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

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

...