Board logo

标题: [文本处理] 如何从txt文本中提取指定格式/特征的字符串 [打印本页]

作者: 留白    时间: 2018-2-13 14:30     标题: 如何从txt文本中提取指定格式/特征的字符串

  1. for /f "delims=- tokens=1-10" %%u in ('findstr "[a-z]-[a-z]" key.txt') do (
  2. set a=%%u&set b=%%v&set c=%%w&set d=%%x&set e=%%y
  3. set a=!a:~-5!&set b=!b:~0,5!&set c=!c:~0,5!&set d=!d:~0,5!&set e=!e:~0,5!
  4. echo !a!-!b!-!c!-!d!-!e! >>KeyFind.txt
  5. echo ==   !a!-!b!-!c!-!d!-!e!
  6. set var=!a!-!b!-!c!-!d!-!e!
复制代码
需要把文本中的key提取出来,如:
NHTJK-DFFPK-4DRM8-MB9RK-T83VMWK4WH-2DNVR-KF8V3-YHFF8-F3K7K
4NH49-69JP4-T3MC6-KH6KM-G3CJQ
【客服激活】 FNT4V-94B6T-T2CXK-K3H2Q-M7WWQ
【客服激活】W8YNW-67JP9-V464G-RB32Y-F9DF3
【客服激活】VJTNQ-GDQFK-WBMK9-P7CGW-7FT43
输出为:NHTJK-DFFPK-4DRM8-MB9RK-T83VM
           WK4WH-2DNVR-KF8V3-YHFF8-F3K7K
           4NH49-69JP4-T3MC6-KH6KM-G3CJQ
           FNT4V-94B6T-T2CXK-K3H2Q-M7WWQ
           W8YNW-67JP9-V464G-RB32Y-F9DF3
           VJTNQ-GDQFK-WBMK9-P7CGW-7FT43
问题:自己写的代码中第一行无法处理,还请高手指教
作者: hlzj88    时间: 2018-2-14 23:22

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=】" %%i in (key.txt) do (
  3. set vv=%%i
  4. set vv=!vv: =!
  5. echo !vv:~0,29!>>321.txt
  6. echo !vv:~29,29!>>321.txt
  7. set ww=%%j
  8. set ww=!ww: =!
  9. echo !ww:~0,29!>>321.txt
  10. echo !ww:~29,29!>>321.txt
  11. )
  12. findstr /i "[a-z]-[a-z]" 321.txt>>KeyFind.txt
  13. del /q 321.txt
复制代码

作者: 留白    时间: 2018-2-15 09:59

回复 2# hlzj88
大佬您好,提取文本中key的前面有可能不是】,还可能有其他符号,这个可以解决吗
作者: ivor    时间: 2018-2-15 11:10

本帖最后由 ivor 于 2018-2-15 11:22 编辑
  1. grep -Po ".{5}(-.{5}){4}" key.txt
复制代码
grep下载地址:http://www.bathome.net/s/tool/in ... ode=4&vermode=2
作者: codegay    时间: 2018-2-15 22:10

本帖最后由 codegay 于 2018-2-16 19:10 编辑
  1. import
  2.     re,
  3.     os,
  4.     strutils
  5. var keyfile = getAppDir() & "/key.txt"
  6. var txt = readfile(keyfile)
  7. echo "文本:\r\n",txt
  8. var result = join(findAll(txt, re"\w{5}(-\w{5}){4}"),"\r\n")
  9. echo "匹配结果:\r\n",result
  10. var newfile = getAppDir() & "/new-key.txt"
  11. writefile(newfile, result)
复制代码
  1. 匹配结果:
  2. NHTJK-DFFPK-4DRM8-MB9RK-T83VM
  3. WK4WH-2DNVR-KF8V3-YHFF8-F3K7K
  4. 4NH49-69JP4-T3MC6-KH6KM-G3CJQ
  5. FNT4V-94B6T-T2CXK-K3H2Q-M7WWQ
  6. W8YNW-67JP9-V464G-RB32Y-F9DF3
  7. VJTNQ-GDQFK-WBMK9-P7CGW-7FT43
复制代码
nim语言

nim语言的官方网站https://nim-lang.org/
作者: codegay    时间: 2018-2-15 22:18

用支持正则功能的编辑器打开,查找 \w{5}(-\w{5}){4}
就可以了。

比如 Notepad++
notepad2-mod
作者: 留白    时间: 2018-2-16 13:58

回复 6# codegay
谢谢您的回复,直接在批处理运行是不是不可以啊
作者: codegay    时间: 2018-2-16 16:34

回复 7# 留白


    不可以。nim语言的。需要自己编译。只是贴出来好看的。
作者: codegay    时间: 2018-2-18 04:08

本帖最后由 codegay 于 2018-2-18 06:24 编辑

使用支持正则查找替换功能的编辑器:
查找中填入:
  1. (.*?)(\w{5}(?:-\w{5}){4}).*?\r?\n?
复制代码
替换中填入:
  1. \2\r\n
复制代码
notepad++ 是支持文件的批量查找替换的。

然后点全部替换就可以了。
作者: codegay    时间: 2018-2-18 10:52


解释一下为什么这么写,
序列号激活码这些东西,通常是字母+数字组成,所以用\w可以避免匹配到其它字符的情况。

\r\n是windows默认的换行模式,linux下是\n,像python好像是默认使用通用换行模式,读入文本后的换行都是\n,\r?\n? 可以保证不同的换行风格都可以匹配到。

后面还要还要加.*?的原因是,考虑中间可以还插入了其它字符的可能情况:
  1. 【242342】 FNT4V-94B6T-T2CXK-K3H2Q-M7WWQ【242342】W8YNW-67JP9-V464G-RB32Y-F9DF3
复制代码
如果没有当然不用写。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2