Python 从某个单词后的行中删除单词
我有一个包含行的文件Python 从某个单词后的行中删除单词,python,Python,我有一个包含行的文件 Type sequential IQ,IQN 所以,当这一行出现时,我希望我的输出是 Type sequential 我试过密码 out = open("file2","w") Pa =open("file","r") for line in file: If re.sub(r'^(Type+\s+sequential).*$', r'\1', line, re.M):
Type sequential IQ,IQN
所以,当这一行出现时,我希望我的输出是
Type sequential
我试过密码
out = open("file2","w")
Pa =open("file","r")
for line in file:
If re.sub(r'^(Type+\s+sequential).*$', r'\1', line, re.M):
print >> out,line
这也不起作用。这是在使用一个列表:
lines = "Type sequential IQ,IQN" # 1
mylist = lines.split() # 2
print(mylist[0], mylist[1]) # 3
1。第一行:定义行。2。第二行:
拆分
带空格的行。结果是['Type','sequential','IQ,IQN']
3。最后一行:打印我的列表的第一项和第二项。这是使用列表:
lines = "Type sequential IQ,IQN" # 1
mylist = lines.split() # 2
print(mylist[0], mylist[1]) # 3
1。第一行:定义行。2。第二行:
拆分
带空格的行。结果是['Type','sequential','IQ,IQN']
3。最后一行:打印我的列表的第一项和第二项。尝试使用索引和长度切片字符串
line = 'Type sequential IQ,IQN'
lines = line[:line.index('Type sequential') + len('Type sequential')]
print(lines)
摘要:索引查找字符串,len确定字符串的长度,然后将其拼接。尝试使用索引和长度对字符串进行切片
line = 'Type sequential IQ,IQN'
lines = line[:line.index('Type sequential') + len('Type sequential')]
print(lines)
摘要:索引查找字符串,len确定字符串的长度,然后将其拼接。您可以按如下方式修改替换指令。最后一个参数不是必需的,而是
\S
->*
。为方便起见,还添加了$
,并删除了组间的\s+
>>> s = "Type sequential IQ,IQN"
>>> lines = re.sub(r'^(Type+\s+sequential)(.*)$', r'\1', s)
>>> lines
'Type sequential'
您可以按如下方式修改替换说明。最后一个参数不是必需的,而是
\S
->*
。为方便起见,还添加了$
,并删除了组间的\s+
>>> s = "Type sequential IQ,IQN"
>>> lines = re.sub(r'^(Type+\s+sequential)(.*)$', r'\1', s)
>>> lines
'Type sequential'
你的具体例子
使用re
的现有答案只适用于一行。但是,由于您调用了变量行
,因此我假设您希望使用输入,例如
lines = 'Type sequential IQ,IQN\nType sequential IQ,IQN'
可能是从带有read
的文件中读取的。在这种情况下,正则表达式需要修改为:
r'^(Type+\s+sequential).*$'
我们需要多行模式,re.M
,您已经了解了。但是需要注意的一件事是,re.M
应该作为标志
关键字参数传递给re.sub
,根据
重要
由于不提供count
关键字参数,因此需要将flags
参数显式指定为flags=re.M
。这是因为re.M
实际上是一个int
,因此将其作为count
的参数也是有效的(在Python REPL中尝试int(re.M)
)<在re.sub
的参数列表中,code>count出现在标志
之前,因此Python假定您要给出一个count
参数。也就是电话
lines = re.sub(r'^(Type+\s+sequential)\s+(\S)', r'\1', lines, re.M)
同:
lines = re.sub(r'^(Type+\s+sequential)\s+(\S)', r'\1', lines, count=re.M)
如果您希望Python抱怨count
参数的类型,那么这可能有点可怕
完整示例
从文件eg.txt
开始,内容如下:
Type sequential IQ,IQN
Type sequential IQ,IQN
然后,我们读取该文件并进行正则表达式替换,如下所示:
import re
with open('eg.txt') as infile:
lines = infile.read()
lines = re.sub(r'^(Type\s+sequential).*$', r'\1', lines, flags=re.M)
print(lines)
之后,您可以使用行执行任何操作,例如写入另一个文件:
with open('out.txt', 'w') as outfile:
outfile.write(lines)
更一般的解决方案
你和你之后的其他人可能会感兴趣的是,有一个普遍的解决问题的方法
从某个单词后面的行中删除单词
具体来说,我们需要一个函数将文件读入字符串,截断特定单词(或单词,或正则表达式模式)后的行,并将截断的版本作为字符串返回
下面是一个实现:
import re
def truncate(after, in_file):
in_lines = in_file.read()
return re.sub(rf"^(.*?{after}).*$", r"\1", in_lines, flags=re.M)
使用方法:
with open(__file__) as f:
print(truncate("in", f))
其中给出了输出(运行truncate并将其自身定义等作为输入):
这似乎是正确的…您的具体示例
使用re
的现有答案只适用于一行。但是,由于您调用了变量行
,因此我假设您希望使用输入,例如
lines = 'Type sequential IQ,IQN\nType sequential IQ,IQN'
可能是从带有read
的文件中读取的。在这种情况下,正则表达式需要修改为:
r'^(Type+\s+sequential).*$'
我们需要多行模式,re.M
,您已经了解了。但是需要注意的一件事是,re.M
应该作为标志
关键字参数传递给re.sub
,根据
重要
由于不提供count
关键字参数,因此需要将flags
参数显式指定为flags=re.M
。这是因为re.M
实际上是一个int
,因此将其作为count
的参数也是有效的(在Python REPL中尝试int(re.M)
)<在re.sub
的参数列表中,code>count
出现在标志
之前,因此Python假定您要给出一个count
参数。也就是电话
lines = re.sub(r'^(Type+\s+sequential)\s+(\S)', r'\1', lines, re.M)
同:
lines = re.sub(r'^(Type+\s+sequential)\s+(\S)', r'\1', lines, count=re.M)
如果您希望Python抱怨count
参数的类型,那么这可能有点可怕
完整示例
从文件eg.txt
开始,内容如下:
Type sequential IQ,IQN
Type sequential IQ,IQN
然后,我们读取该文件并进行正则表达式替换,如下所示:
import re
with open('eg.txt') as infile:
lines = infile.read()
lines = re.sub(r'^(Type\s+sequential).*$', r'\1', lines, flags=re.M)
print(lines)
之后,您可以使用行执行任何操作,例如写入另一个文件:
with open('out.txt', 'w') as outfile:
outfile.write(lines)
更一般的解决方案
你和你之后的其他人可能会感兴趣的是,有一个普遍的解决问题的方法
从某个单词后面的行中删除单词
具体来说,我们需要一个函数将文件读入字符串,截断特定单词(或单词,或正则表达式模式)后的行,并将截断的版本作为字符串返回
下面是一个实现:
import re
def truncate(after, in_file):
in_lines = in_file.read()
return re.sub(rf"^(.*?{after}).*$", r"\1", in_lines, flags=re.M)
使用方法:
with open(__file__) as f:
print(truncate("in", f))
其中给出了输出(运行truncate并将其自身定义等作为输入):
这似乎是正确的…可能OP需要多行模式,因为输入跨越多行。查看我的答案以了解这种情况下的修复方法。是的,您的答案更完整,因此flags
参数:)也可以通过列表理解来完成,但我猜效率较低。谢谢问题