我有一个键值(ID,标签)格式的CSV文件,其中包含以下内容:
1,技术
2,美术;杰作
3,现代艺术4,伪影;人工制品
5,制品
我的目标是使用python只返回ID 1,2和3,这些标签带有" art"显而易见的。当我使用find()函数(myfile.find(" art"))时,它会找到ID为1-5的。
我的第一个想法是关注字符串周围的字符" art"在标签中。也许我可以使用isalpha()函数来询问字符串" art"之前和之后的字符。确实是字母,而不是标点符号。但是,这是我编写的第一个python脚本之一,因此很可能会有一个REGEX在一行中执行此操作,我不知道。
非常感谢任何帮助。
答案 0 :(得分:2)
您可以使用regex \b
断言:
>>> import re
>>> pairs = ((1, "art"), (2, "fine art;masterpiece"), (3, "modern art"),
(4, "artifact;artefact"), (5, "article"))
>>> [id for id, tag in pairs if re.search(r"\bart\b", tag)]
[1, 2, 3]
正如文档中所述,\b
匹配'字之间的边界。和一个非单词'字符(或反之亦然),或字符与字符串的开头/结尾之间。
答案 1 :(得分:1)
您需要构建一个实现索引逻辑的查找索引。读取您的文件,解析每个CSV行,并根据dict
更新查找索引。查找索引中的每个项目都应该标准化,例如小写,并指向ID列表。
这是一个小片段:
from StringIO import StringIO
file_content = StringIO('''1,art
2,fine art;masterpiece
3,modern art
4,artifact;artefact
5,article''')
_index = {}
for line in file_content:
# parse CSV
(_id, _, tags) = line.strip().partition(',')
# parse tags
tags = tags.split(';')
tokens = set([])
# tokenize tags
for tag in tags:
for token in tag.split(' '):
# add normalized token to tokens set
tokens.add(token.lower())
# update index
for token in tokens:
if token in _index:
_index[token].append(_id)
else:
_index[token] = [_id]
# lookup tag arg in your index
print _index['art']
>>> ['1', '2', '3']
答案 2 :(得分:0)
您可以使用此代码:
lines = ['art', 'fine art;masterpiece', 'modern art', 'artifact;artefact', 'article']
for l in lines:
lis = [_.split(' ') for _ in l.split(';')] # Split the values.
lis = [item for sublist in lis for item in sublist] # Flatten the list.
print 'art' in lis # Check if 'art' is contained.
这允许您确定包含艺术(而非工件)的行。或者像这样:
lines = ['art', 'fine art;masterpiece', 'modern art', 'artifact;artefact', 'article']
idx = 1
for l in lines:
lis = [_.split(' ') for _ in l.split(';')] # Split the values.
lis = [item for sublist in lis for item in sublist] # Flatten the list.
if 'art' in lis: # Check if 'art' is contained.
print idx
idx = idx + 1
答案 3 :(得分:0)
简单而甜蜜:使用\ b - Word Boundaries
a = ['1,art','2,fine art;masterpiece','3,modern art','4,artifact,artefact','5,article']
for data in a:
output = re.search(r'\bart\b',data)
if 'art' in str(output):
ids = re.findall('\d+', data)
print(ids)