在regex的参数集上将一个大的文本文件拆分为多个较小的文本文件



我有一个大的文本文件,看起来像:

....
sdsdsd
..........
asdfhjgjksdfk dfkaskk sdkfk skddkf skdf sdk ssaaa akskdf sdksdfsdf ksdf sd kkkkallwow.
sdsdllla lsldlsd lsldlalllLlsdd asdd. sdlsllall asdsdlallOEFOOASllsdl lsdlla.
slldlllasdlsd.ss;sdsdasdas.
......
ddss
................
asdfhjgjksdfk ddjafjijjjj.dfsdfsdfsdfsi dfodoof ooosdfow oaosofoodf aosolflldlfl , dskdkkfkdsa asddf;akkdfkdkk . sdlsllall asdsdlallOEFOOASllsdl lsdlla.
slldlllasdlsd.ss;sdsdasdas.
.....
xxxx
.......
asdfghjkl

我想将文本文件拆分为多个小文本文件,并在发生…时将其保存为.txt。。。。。[多个周期标记]像一样保存

group1_sdsdsdd.txt

....
sdsdsd
..........
asdfhjgjksdfk dfkaskk sdkfk skddkf skdf sdk ssaaa akskdf sdksdfsdf ksdf sd kkkkallwow.
sdsdllla lsldlsd lsldlalllLlsdd asdd. sdlsllall asdsdlallOEFOOASllsdl lsdlla.
slldlllasdlsd.ss;sdsdasdas.

group1_ddss.txt

ddss
................
asdfhjgjksdfk ddjafjijjjj.dfsdfsdfsdfsi dfodoof ooosdfow oaosofoodf aosolflldlfl , dskdkkfkdsa asddf;akkdfkdkk . sdlsllall asdsdlallOEFOOASllsdl lsdlla.
slldlllasdlsd.ss;sdsdasdas.

group1_xxxx.txt

.....
xxxx
.......
asdfghjkl

我已经认为,通过使用以下某种正则表达式可以完成

txt =re.sub(r'(([^ws])2+)', r' ', txt).strip() #for letters more than 2 times

但不能完全弄清楚。

保存的文本文件应命名为group1_sdsdsd.dtxtgroup1_ddss.txtgroup1_xxxx.txt[group1是特定大文本文件的标识符,因为我有多个更大的文本文件,需要对所有文件执行相同操作才能知道我正在拆分哪个大文本文件。

如果你想只在同一行上获得多个点的零件,你可以使用并获得单独的零件,可以使用这样的模式:

^.{3,}n(S+)n.{3,}(?:n(?!.{3,}nS+n.{3,}).*)*

解释

  • ^字符串开始
  • .{3,}n匹配3个或多个点和一条换行符
  • (S+)n组1中捕获文件名的1+个非空白字符,并匹配换行符
  • .{3,}匹配3个或更多点
  • (?:非捕获组作为一个整体重复
    • n匹配换行符
    • (?!.{3,}nS+n.{3,})否定前瞻,断言从当前位置来看,我们没有看到与点匹配的模式,文件名介于两者之间
    • .*全线匹配
  • )*关闭非捕获组并可选择重复

然后可以使用re.finditer循环匹配,并使用组1值作为文件名的一部分。

请参阅包含单独部分的regex演示和Python演示。

示例代码

import re
pattern = r"^.{3,}n(S+)n.{3,}(?:n(?!.{3,}nS+n.{3,}).*)*"
s = ("....your data here")
matches = re.finditer(pattern, s, re.MULTILINE)
your_path = "/your/path/"
for matchNum, match in enumerate(matches, start=1):
f = open(your_path + "group1_{}".format(match.group(1)), 'w')
f.write(match.group())
f.close()

最新更新