字符串中的CSV通配符



我正在使用CSV文件来读取我在文本文件中查找的术语。

我想使用通配符或"喜欢"作为一个术语。我不是为文本文档名称寻找通配符,而是为我在CSV文件中搜索的术语寻找通配符。

例如:CSV文件中的术语要在文本文件中搜索,每个术语都在自己的行中。

test**搜索测试、测试、测试等项目
列表
桌子
椅子

是否有一个通配符可以在CSV文件中使用,以便返回该单词的所有变体?我想把通配符放在CSV文件中。

下面是我的代码,它读取我正在搜索的术语的文件是contract_search_terms.csv

def main():
txt_filepaths = glob.glob("**/*.txt", recursive=True)
start = time.time()
results = {}
new_results = [] #place dictionary values organized per key = value instead of key = tuple of values 
term_filename = open('contract_search_terms.csv', 'r') #file where terms to be searched is found
term_file = csv.DictReader(term_filename)
search_terms =[] #append terms into a list, this means that we can use several columns and append them all to one list.

#############search for the terms imported into the list############################################################
for col in term_file:

search_terms.append(col['Contract Terms']) #indicate what columns you want read in
print(search_terms) #this is just a check to show what terms are in the list

for filepath in txt_filepaths:
print(f"Searching document {filepath}")   #print what file the code is reading

search_terms = search_terms #place terms list into search_terms so that the code below can read it when looping through the contracts.

filename = os.path.basename(filepath)
found_terms = {} #dictionary of the terms found

line_number={}


for term in search_terms:
if term in found_terms.keys():
continue

with open(filepath, "r", encoding="utf-8") as fp:
lines = str(fp.readlines()).split('.') #turns contract file lines as a list

for line in lines:
if line.find(term) != -1: #line by line is '-1', paragraph 'n'
line_number = lines.index(line)
new_results.append(f"'{term}' New_Column '{filename}' New_Column '{line}' New_Column '{line_number}'") #placing the results from the print statement below into a list
print(f"Found '{term}' in document '{filename}' in line '{line_number}'") 
if term in results.keys():
pages = results[''.join(term)].append([filename,line,line_number])
else:
results[term] = [filename]
#Place results into dataframe and create a csv file to use as a check if results_reports is not correct
d2=pd.DataFrame(new_results, columns=['Results']) #passing the list to a dataframe and giving it a column title
d2.to_csv('results.csv', index=True) 

为了简化代码流,而不需要测试通配符,然后分支到另一种搜索,我建议您通常使用正则表达式模块(在标准Python发行版中可用(:

import re

以及作为正则表达式搜索的术语的正则表达式模式:

lst_found_terms = re.findall(term, line)
if lst_found_terms != []: 
for found_term in lst_found_terms: 

而不是:

if line.find(term) != -1:

如果您完全查找'test',正则表达式模式将与find((函数中的模式(即'test'(完全相同,如果您想查找所有以'test'开头的单词,则模式将为r'btestw*'

换句话说,任何TERM结尾的"通配符"都将包含前缀为r'\b'和结尾为r'\w*'的术语(以CSV形式存储为:bTERMw*(。

如果在re.findall()中使用参数flags=re.I,则正则表达式可以执行不区分大小写的搜索。

在另一个答案if 'test' in line:中提出的简单条件也将评估为True,用于"证明"或"竞争"。为了避免这种情况,正则表达式的"通配符"在术语(r'b'(的开头设置了一个单词边界。

请注意,不限制"test"的扩展字符数,通配符也会显示"testostone"。您可以限制用{0,3}替换*的扩展字符的数量,最多增加3个字符(包括测试和测试,但不包括睾酮(。

在您的特定情况下(testteststesting(,简单的内部运算符可能就足够了,例如:

"test" in line将对所有三个单词的True进行评估,而if "test" in line:将完成这项工作。

在更复杂的情况下,您可能希望使用正则表达式。

相关内容

  • 没有找到相关文章

最新更新