正则表达式在Python和regex101中的作用不同

2024-09-29 17:11:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的输入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)

Tags: 文件retxtlinesaresultopenjean
2条回答

使用[^,]*可以选择匹配除逗号以外的任何字符,也可以匹配->(假设->;是tsv制表符分隔值中的制表符)

然后使用([^\t]*)\t捕获除制表符之外的任何字符,后跟制表符

但是,然后用一个空字符串替换整个匹配,删除刚刚匹配的所有内容


您可以切换模式中的第二个捕获组,并在替换中同时使用这两个组

^([^,]*,[^,]*)[^\t]*(\t)
 |                  |   
 group 1             group 2

Regex demo

或者使用带有前瞻性assering (?=\t)选项卡的单个捕获组:

^([^,]*,[^,]*)[^\t]*(?=\t)

Regex demo

范例

import re
 
pattern = r"^([^,]*,[^,]*)[^\t]*(?=\t)"
 
s = ("Hornus, Jean-Michel, pasteur      \n"
    "Diepenbeek, H. F. W., 1...-1..., capitaine 1.. 1..\n"
    "Grosbellet, Bernard        \n"
    "ʿĪsa       \n"
    "Hacquet, Pierre-François, montfortain, Le P.       ")
 
result = re.sub(pattern, r"\1", s, 0, re.MULTILINE)
 
if result:
    print (result)

输出

Hornus, Jean-Michel     
Diepenbeek, H. F. W.    1.. 1..
Grosbellet, Bernard     
ʿĪsa        
Hacquet 

您可以使用此正则表达式来匹配:

(?m)^([^,\n]*,[^\n,]*),.*?(\t)

并替换为:

\1\2

正则表达式详细信息:

  • (?m):启用MULTILINE模式
  • ^:开始
  • [^,\n]*,[^\n,]*):匹配0+非逗号、非换行符,后跟一个,,后跟0+非逗号、非换行符,在组#1中捕获它
  • ,:匹配一个逗号
  • .*?:Natch 0个或多个任意字符(惰性)
  • (\t):匹配选项卡并将其捕获到组#2中

RegEx Demo

相关问题 更多 >

    热门问题