在Python中识别字符串子串的最有效方法是什么?

3

我需要搜索一个相当长的字符串以查找CPV(通用采购词汇)代码。

目前,我使用简单的for循环和str.find()来完成这个任务。

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

最有效的搜索所有不同迭代代码的方法是什么?是简单地重新格式化多达10,000个CPV代码中的每一个,并对每个实例使用str.find()吗?

不同格式的示例可能如下所示:

30124120-1 
301241201 
30124120 - 1
30124120 1
30124120.1

etc.

Thanks :)

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非常匹配。)

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)

希望这能有所帮助!

+1 对于规范化的赞同。我建议使用 r 字符串前缀而不是 \\\t - Fred Foo
@larsman:谢谢,我已经将它改为原始字符串并重新排列了字符列表以便更容易理解。 - Hugh Bothwell

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接