我有一个像这样的输入tsv文件
Hornus, Jean-Michel, pasteur->->
Diepenbeek, H. F. W., 1...-1..., capitaine->1..->1..
Grosbellet, Bernard->->
ʿĪsa->->
Hacquet, Pierre-François, montfortain, Le P.->->
我想有一个输出文件,看起来像这样
Hornus, Jean-Michel->->
Diepenbeek, H. F. W.->1..->1..
Grosbellet, Bernard->->
ʿĪsa->->
Hacquet, Pierre-François->->
我使用regex 101构建了我的regex,我得到了一个运行良好的: [^,]*,[^,]*([^\t]*)\t
我的Python代码如下所示:
import re
fin = open("fin.txt", "rt")
fout = open("fout.txt", "wt")
for line in fin:
line = re.sub(r"[^,]*,[^,]*([^\t]*)\t", "", line)
fout.write(line)
fin.close()
fout.close()
我不明白的是,我的代码删除了所有带有逗号的行,而我的输出是
ʿĪsa->->
欢迎任何帮助
更新: 感谢社区,以下是我的解决方案:
import re
pattern = r"^([^,]*,[^,]*)[^\t]*(?=\t)"
fin = open("fin.txt", "rt")
fout = open("fout.txt", "wt")
for line in fin:
result=re.sub(pattern, r"\1", line, 0, re.MULTILINE)
if result:
fout.write(result)
使用
[^,]*
可以选择匹配除逗号以外的任何字符,也可以匹配->
(假设->;是tsv制表符分隔值中的制表符)然后使用
([^\t]*)\t
捕获除制表符之外的任何字符,后跟制表符但是,然后用一个空字符串替换整个匹配,删除刚刚匹配的所有内容
您可以切换模式中的第二个捕获组,并在替换中同时使用这两个组
Regex demo
或者使用带有前瞻性assering
(?=\t)
选项卡的单个捕获组:Regex demo
范例
输出
您可以使用此正则表达式来匹配:
并替换为:
正则表达式详细信息:
(?m)
:启用MULTILINE
模式^
:开始[^,\n]*,[^\n,]*)
:匹配0+非逗号、非换行符,后跟一个,
,后跟0+非逗号、非换行符,在组#1中捕获它,
:匹配一个逗号.*?
:Natch 0个或多个任意字符(惰性)(\t)
:匹配选项卡并将其捕获到组#2中RegEx Demo
相关问题 更多 >
编程相关推荐