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
参数:)也可以通过列表理解来完成,但我猜效率较低。谢谢问题