找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2855|回复: 8

[求助] 新手求助:在文本中查找指定内容

2

主题

6

帖子

6

积分

贫民

积分
6
yjing1982 发表于 2022-1-24 15:17:38 | 显示全部楼层 |阅读模式
我在工作中需要将文本中的指定内容复制到其他文本,格式和原来文本相同,不过使用正则表达式后,都有\n, 谁能处理下和原文本(st.txt)格式相同,谢谢。
  1. import os, re

  2. with open (r'C:\Users\tjing\Desktop\python\st.txt','r+') as f:
  3.     keyStart='ONOFFLINE : ON LINE'
  4.     keyEnd='Warning:Site-01,'      
  5.     buff = f.read()
  6.     pat = re.compile(keyStart+'.*?'+keyEnd, re.S)
  7.     result = pat.findall(buff)
  8.     print (result)
复制代码
另外,我参考其他网友的方法,不过以下程序只能检测关键字keystart在开头的状态,在文本中间就无法查找了,能帮忙找到原因吗,谢谢。
  1. # 以下方法只适用于关键语句keyStart在开头时使用      
  2. import os, re
  3. def GetMiddleStr(content,startStr,endStr):
  4.     '''提取字符串content当中,startStr与endStr之间的内容
  5.    
  6.     '''
  7.     startIndex = content.index(startStr)
  8. ##    if startIndex>=0:
  9. ##        startIndex += len(startStr)
  10.     endIndex = content.index(endStr)
  11.     endIndex+=len(endStr)
  12.     return content[startIndex:endIndex]

  13. with open (r'C:\Users\tjing\Desktop\python\st.txt','r+') as f:
  14.     keyStart=r'ONOFFLINE : ON LINE'
  15.     keyEnd=r'Warning:Site-01, ### remote_fetch(cim_TestResult) ### errr!!!'      
  16.     buff = f.read()
  17.     result = GetMiddleStr(buff,keyStart,keyEnd)
  18.     result = result.strip() # 清除前后的换行符
  19.     print(result)
复制代码


运行后效果

运行后效果

st.txt

16.05 KB, 下载次数: 9

源文件

回复

使用道具 举报

0

主题

17

帖子

17

积分

贫民

积分
17
wsk 发表于 2022-1-25 15:26:49 | 显示全部楼层
import os, re

with open (r'C:\Users\wskxy\Desktop\st.txt','r+') as f:
    keyStart='ONOFFLINE : ON LINE'
    keyEnd='Warning:Site-01,'
    print("***")
    buff = f.read()
    print(buff)
    print("&&&&&")
    pat = re.compile(keyStart+'.*?'+keyEnd, re.S)
    result = pat.findall(buff)
    result = str(result).replace("\\n","")
    print(result)
回复 支持 反对

使用道具 举报

0

主题

17

帖子

17

积分

贫民

积分
17
wsk 发表于 2022-1-25 15:30:05 | 显示全部楼层
["ONOFFLINE : ON LINE             [2022/01/16 06:23:03.802]           ATC LOT NO : VE2025VE1480        [2022/01/16 06:23:03.817]             CHKIT NO : 78-TWCK-089         [2022/01/16 06:23:03.817]        MATCHPLATE NO : TWMP273-CK180       [2022/01/16 06:23:03.817]        CUSTOM LOT NO :                     [2022/01/16 06:23:03.817]          DEVICE NAME : 77GBY8T0A25LFAFBP2AW[2022/01/16 06:23:03.817]          RECIPE NAME : FTH1N3118G          [2022/01/16 06:23:03.817]               DSA NO :                     [2022/01/16 06:23:03.817]
结果是这样不知道是不是你想要的,还可以循环换成list格式
也不知道这么干有没有风险
回复 支持 反对

使用道具 举报

0

主题

10

帖子

10

积分

贫民

积分
10
roger0wang 发表于 2022-1-27 11:55:24 | 显示全部楼层
re.findal()将字符串中所有不重叠的匹配结果作为一个list或者tuple对象返回。你最开始的代码print(result)是直接打印list对象内容,换行符被显示打印出来了。如果在shell中打印,可以将print(result)改一下:
    for line in result:
        print(line)
回复 支持 反对

使用道具 举报

2

主题

6

帖子

6

积分

贫民

积分
6
yjing1982  楼主| 发表于 2022-1-28 15:22:36 | 显示全部楼层
roger0wang 发表于 2022-1-27 11:55
re.findal()将字符串中所有不重叠的匹配结果作为一个list或者tuple对象返回。你最开始的代码print(result) ...

太感谢了,这个就是和源文件相同的格式。另外,我再问下,我原来是想用以下语句,为什么会返回空值?
  1. result = pat.findall(buff)
  2. result=str(result).strip()
  3. print (result)
复制代码
回复 支持 反对

使用道具 举报

2

主题

6

帖子

6

积分

贫民

积分
6
yjing1982  楼主| 发表于 2022-1-28 15:28:33 | 显示全部楼层
wsk 发表于 2022-1-25 15:30
["ONOFFLINE : ON LINE             [2022/01/16 06:23:03.802]           ATC LOT NO : VE2025VE1480      ...

谢谢你,wsk,每次你都第一个回复我。
然后用了你的代码,会产生两段截取的文本,第一部分格式是对的,不过内容有些区别;第二段是格式不对。
具体的输出格式可以参考另外一位网友roger0wang的。谢谢。
回复 支持 反对

使用道具 举报

0

主题

10

帖子

10

积分

贫民

积分
10
roger0wang 发表于 2022-1-29 14:25:18 | 显示全部楼层
yjing1982 发表于 2022-1-28 15:22
太感谢了,这个就是和源文件相同的格式。另外,我再问下,我原来是想用以下语句,为什么会返回空值?
...

从我这里测试的结果看,这应该仍旧会返回值的,只是显示出来仍旧跟之前的值“一模一样”,但类型从list变成了str。
print(object)时,实际是在调用object的__str__方法打印object,每个类型(list,str)对象的__str__的实现不一样,最终显示也会有差异。我之前用for循环打印result列表,就是转换成打印列表中的str对象了,它会将\n识别为换行符进行换行。
就我运行看到的你这个result,其值为 ['strings'](备注:用strings代指findall匹配到的值)。当你运行str(result),得到的值为"['strings']",即转换成了一个str了,"['strings']".strip(),仍旧是"['strings']"(list转换后头尾并没有空格),再赋值,最终 result值为"['strings']"
回复 支持 反对

使用道具 举报

2

主题

6

帖子

6

积分

贫民

积分
6
yjing1982  楼主| 发表于 2022-1-29 18:57:38 | 显示全部楼层
roger0wang 发表于 2022-1-29 14:25
从我这里测试的结果看,这应该仍旧会返回值的,只是显示出来仍旧跟之前的值“一模一样”,但类型从list变 ...

谢谢,理解了、用for line in result的话,就是对每一行进行处理了。
然后问下你用的是哪个第三方编译工具,公司的电脑只给装了python.
回复 支持 反对

使用道具 举报

0

主题

10

帖子

10

积分

贫民

积分
10
roger0wang 发表于 2022-1-30 10:03:07 | 显示全部楼层
本帖最后由 roger0wang 于 2022-1-30 10:07 编辑
yjing1982 发表于 2022-1-29 18:57
谢谢,理解了、用for line in result的话,就是对每一行进行处理了。
然后问下你用的是哪个第三方编译工 ...

sorry,我这里随意写的line容易混淆,for line in result是对列表result的每一个列表项进行打印,改成for item in result字面更合适。因为根据你提供的测试文本,观察得到的result列表中只有一个列表项,所以,你也可以不用这个循环,直接将原来的print(result)改成print(result[0]),也能实现的。我用的pycharm社区版,官网免费下载使用,Download PyCharm: Python IDE for Professional Developers by JetBrains
BTW,春节快乐,万事如意~
回复 支持 反对

使用道具 举报

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

本版积分规则

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