Python:从文本文件中提取标签

4
因此,我编写了以下代码来提取带有'#'的标签和带有'@'的标签,然后将它们附加到一个列表中并按降序排序。事实上,文本可能没有完美地格式化,每个单独的标签和接下来的标签之间可能没有空格,这可能会导致问题-可以通过for循环中的#print语句进行检查:
#socality#thisismycommunity#themoderndayexplorer#modernoutdoors#mountaincultureelevated
.split()方法不能处理这些。如何解决这个问题才是最佳实践?
这里是.txt文件。
感谢您的时间。
name = input("Enter file:")
if len(name) < 1 : name = "tags.txt"
handle = open(name)
tags = dict()
lst = list()

for line in handle :
    hline = line.split()
    for word in hline:
        if word.startswith('@') : tags[word] = tags.get(word,0) + 1
        else :
            tags[word] = tags.get(word,0) + 1
        #print(word)

for k,v in tags.items() :
    tags_order = (v,k)
    lst.append(tags_order)

lst = sorted(lst, reverse=True)[:34]
print('Final Dictionary: ' , '\n')
for v,k in lst :
    print(k , v, '')

如果文本只包含标签和配置文件,但格式不规范,您可以使用正则表达式。它们非常适合这样的任务。 - Vlad DX
1个回答

7

使用正则表达式。有一些限制:标签必须以#@开头,并且不能包含任何空格或其他空白字符。

这段代码:

import re
tags = []
with open('../Downloads/tags.txt','Ur') as file:
    for line in f.readline():
        tags += re.findall(r'[#@][^\s#@]+', line)

创建文件中所有标签的列表。您可以轻松调整代码将找到的标签存储在字典中;而不是直接将结果存储在tags中,循环遍历每个项并根据需要执行操作。
正则表达式由以下两个自定义字符类构建:
- [#@] - 在开头要么是单一字符#@ - [^\s#@]+ - 不包含任何单一空格字符(\s匹配所有空白字符,如空格、制表符和换行符),#或@的序列; 至少一个,尽可能多。
因此,findall从任何标记的开头开始匹配,然后抓住尽可能多的内容,仅在遇到任何“not”字符时停止。 findall返回匹配项目的列表,您可以立即将其添加到现有列表中,或依次遍历找到的项目。
for tag in re.findall(r'[#@][^\s#@]+', line):
    # process "tag" any way you want here

源文本文件包含Windows风格的\r\n行结束符,因此在我的Mac上最初出现了许多空白“行”。在Python的行读取部分透明地处理这个问题,可以通过在通用换行模式下打开文本文件来确保。


这个可以处理简单的情况,但是对于词边界的特殊情况呢,例如hello#tag 和结尾有特殊字符的情况,例如 #tag... - minusf

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