3

我需要在相当长的字符串中搜索 CPV(通用采购词汇)代码。

目前我正在用一个简单的 for 循环和 str.find()

问题是,如果 CPV 代码以稍微不同的格式列出,该算法将找不到它。

在字符串中搜索代码的所有不同迭代的最有效方法是什么?这仅仅是重新格式化多达 10,000 个 CPV 代码并为每个实例使用 str.find() 的情况吗?

不同格式的示例如下

30124120-1 
301241201 
30124120 - 1
30124120 1
30124120.1

等等

谢谢 :)

4

3 回答 3

4

尝试正则表达式:

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

(修改直到它与您的数据中的 CPV 紧密匹配。)

于 2011-01-12T19:09:59.253 回答
1

尝试使用re(Python 的正则表达式)中的任何函数。有关更多信息,请参阅文档

您可以制作一个正则表达式来接受这些代码的多种不同格式,然后使用re.findall或类似的东西来提取信息。我不确定 CPV 是什么,所以我没有它的正则表达式(尽管也许你可以看看谷歌是否有任何正则表达式?)

于 2011-01-12T19:08:05.370 回答
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)

希望有帮助!

于 2011-01-13T02:27:41.520 回答