鱼C论坛

 找回密码
 立即注册
查看: 1176|回复: 12

[已解决]字符串中 提取小于5个带有空格的一行数据 求助

[复制链接]
发表于 2021-12-3 08:31:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我有多行数据,实例如下(每一个词用一个空格隔开,以一个句号结尾):

A& # B B B .
C& # N N MM .
EE # LLLL .

我像提取有&字符的词”#“后空格小于5的一行数据;具体提取的结果是:

A& # B B B .
C& # N N MM .

我目前的代码:

import re
a = open(r"C:\Users\amgalang\Desktop\第二章\词典资源中被标注的研究词条集合 - 副本.txt", encoding="utf-8")
dict = a.readlines()
list1=[]
for i in dict:
       if " " in i.split('#')[-1]:
              i.count(" ")
       if "&" in i.split('#')[0] and i.count(" ")<4 in i.split('#')[-1]:
              print(i)

还是缺点什么,希望帮帮我 补全,谢谢噢。
最佳答案
2021-12-3 09:36:26
  1. with open(r"C:\Users\amgalang\Desktop\第二章\词典资源中被标注的研究词条集合 - 副本.txt", encoding="utf-8") as f:
  2.     s = f.read()
  3. result = []
  4. for line in s.split('\n'):
  5.     if '&' in line:
  6.         lh, lb = line.split('#')
  7.         if lb.count(' ') < 5:
  8.             result.append(line)
  9. print(result)

复制代码

  1. import re   # 没有使用到,删除
  2. a = open(r"C:\Users\amgalang\Desktop\第二章\词典资源中被标注的研究词条集合 - 副本.txt", encoding="utf-8")   # 文件没有主动关闭,可使用with打开,让系统关闭
  3. dict = a.readlines()
  4. list1=[]
  5. for i in dict:
  6.        if " " in i.split('#')[-1]:  # 没有意义
  7.               i.count(" ")  # 计算了数目,但没有赋值给变量,这两行没有意义。而且下一句又计算了一次。
  8.        if "&" in i.split('#')[0] and i.count(" ")<4 in i.split('#')[-1]:  # 如果变量已经固定,后续有多次调用,应避免再次index索引
  9.               print(i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-3 09:36:26 | 显示全部楼层    本楼为最佳答案   
  1. with open(r"C:\Users\amgalang\Desktop\第二章\词典资源中被标注的研究词条集合 - 副本.txt", encoding="utf-8") as f:
  2.     s = f.read()
  3. result = []
  4. for line in s.split('\n'):
  5.     if '&' in line:
  6.         lh, lb = line.split('#')
  7.         if lb.count(' ') < 5:
  8.             result.append(line)
  9. print(result)

复制代码

  1. import re   # 没有使用到,删除
  2. a = open(r"C:\Users\amgalang\Desktop\第二章\词典资源中被标注的研究词条集合 - 副本.txt", encoding="utf-8")   # 文件没有主动关闭,可使用with打开,让系统关闭
  3. dict = a.readlines()
  4. list1=[]
  5. for i in dict:
  6.        if " " in i.split('#')[-1]:  # 没有意义
  7.               i.count(" ")  # 计算了数目,但没有赋值给变量,这两行没有意义。而且下一句又计算了一次。
  8.        if "&" in i.split('#')[0] and i.count(" ")<4 in i.split('#')[-1]:  # 如果变量已经固定,后续有多次调用,应避免再次index索引
  9.               print(i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-3 09:57:43 | 显示全部楼层

学到了,谢谢您的帮助,目前出现了一个问题,我把代码用到另一个文件上 有如下报错,希望您看看 谢谢:
Traceback (most recent call last):
  File "C:\Users\amgalang\Desktop\第二章\提取小于5个空格符的数据.py", line 6, in <module>
    lh, lb = line.split('#')
ValueError: not enough values to unpack (expected 2, got 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-3 10:05:19 | 显示全部楼层
Amgalang 发表于 2021-12-3 09:57
学到了,谢谢您的帮助,目前出现了一个问题,我把代码用到另一个文件上 有如下报错,希望您看看 谢谢:
...

txt有没有带#的空行吧,把txt发上来看看。
我这代码假定你的txt是没有垃圾数据的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-3 10:11:16 | 显示全部楼层
suchocolate 发表于 2021-12-3 10:05
txt有没有带#的空行吧,把txt发上来看看。
我这代码假定你的txt是没有垃圾数据的。

数据有点大,发不上去,那我找找看 空行 谢谢哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-3 10:13:48 | 显示全部楼层
Amgalang 发表于 2021-12-3 10:11
数据有点大,发不上去,那我找找看 空行 谢谢哒

传网盘分享链接
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-3 10:26:11 | 显示全部楼层
Amgalang 发表于 2021-12-3 09:57
学到了,谢谢您的帮助,目前出现了一个问题,我把代码用到另一个文件上 有如下报错,希望您看看 谢谢:
...
  1. with open(r"C:\Users\amgalang\Desktop\第二章\词典资源中被标注的研究词条集合 - 副本.txt", encoding="utf-8") as f:
  2.     s = f.read()
  3. result = []

  4. for line in s.split('\n'):
  5.     try:
  6.         if '&' in line:
  7.             lh, lb = line.split('#')
  8.             if lb.count(' ') < 5:
  9.                 result.append(line)
  10.     except Exception as e:
  11.         print(e)
  12.         continue
  13. print(result)

复制代码


加个异常处理机制就好了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-3 10:26:19 | 显示全部楼层

好的,我把 指代有“#”符号的筛选出来,在其上 跑了下代码,然后:
Traceback (most recent call last):
  File "C:\Users\amgalang\Desktop\第二章\提取小于5个空格符的数据.py", line 6, in <module>
    lh, lb = line.split('#')
ValueError: too many values to unpack (expected 2)

我的文件链接(是小语种的文件):
链接:https://pan.baidu.com/s/1WlWtPNzvS-hgYH5s4B0bcw
提取码:9999
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-3 10:37:25 | 显示全部楼层
本帖最后由 Stubborn 于 2021-12-3 11:01 编辑

至于你后面要提取空格少于5的话,符合条件的都晒选出来了,遍历一次,用分割函数,得到前后两段数据,在用count函数统计后段的空格数量即可


  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import re
  4. txt = open(path).read()
  5. res = re.findall(".*?&.*?#.*?\.", txt)
  6. result = []
  7. for each in res:
  8.     a, b = each.split('#')
  9.     if b.count(" ") < 5:
  10.         result.append(each)

复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-3 11:43:42 | 显示全部楼层
Amgalang 发表于 2021-12-3 10:26
好的,我把 指代有“#”符号的筛选出来,在其上 跑了下代码,然后:
Traceback (most recent call last) ...

看了下原始文档,有的行确实没有#,而有的行有多个#。
稍稍改下即可。
  1. with open(r"C:\Users\amgalang\Desktop\第二章\词典资源中被标注的研究词条集合 - 副本.txt", encoding="utf-8") as f:
  2.     s = f.read()
  3. result = []
  4. for line in s.split('\n'):
  5.     if '&' in line and '#' in line:
  6.         lh, lb = line.split('#', 1)
  7.         if lb.count(' ') < 5:
  8.             result.append(line)
  9. print(result)
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-4 00:09:23 | 显示全部楼层
z5560636 发表于 2021-12-3 10:26
加个异常处理机制就好了.

感谢您的帮助,代码学到了,good night~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-4 00:09:53 | 显示全部楼层
suchocolate 发表于 2021-12-3 11:43
看了下原始文档,有的行确实没有#,而有的行有多个#。
稍稍改下即可。

好的,谢谢哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-4 00:11:22 | 显示全部楼层
Stubborn 发表于 2021-12-3 10:37
至于你后面要提取空格少于5的话,符合条件的都晒选出来了,遍历一次,用分割函数,得到前后两段数据,在用c ...

感谢您的帮助,正在学习代码,谢谢哒 good night~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 02:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表