通过读取特定字符':'左侧来删除行?

3

我有一个文本文件,有100行,看起来像这样:

hsh:222
shhhshshs:2294
sjasda:2324
s_s:223
aaa:111
asdasd:1111

我想删除所有冒号前有三个以上字符的行,以便输出为:
hsh:222
s_s:223
aaa:111

我该如何做这个?我不知道如何读取冒号前面的左侧内容。我会假设是这样的:

for x in f:
    newline = x.strip()+.split(':')
    if len(newline.rstrip()) >= 3:
        f2.write(newline)

1
newline = x.strip()+.split(':') 这段代码的作用是什么?请查看相关函数文档并正确调用它们(例如,去掉 +)。 - Mad Physicist
1
你能不能检查一下 if x[4] == ':' : f2.write(x) - Joe Ferndz
grep -vE '^[^:]{4}' file.txt - tripleee
3个回答

2

您已经接近成功了。您可以直接在方法结果上调用另一个方法:

elements = x.strip().split(':')

这将返回一个包含两个元素的列表。要获取列表中的第一个元素,请对其进行索引:
first = elements[0]

或者可以写成一行代码:
first = x.strip().split(':')[0]

然后像往常一样继续操作。请记住,如果first长度小于等于3,应该将x写入输出,而不是newlinefirst


1
我会使用带有过滤功能的列表推导式。您可以使用str类的find()方法查找每个单词中冒号的索引,然后从开头切片到冒号索引。请保留HTML标签。
list_ = ['hsh:222', 'shhhshshs:2294', 'sjasda:2324', 's_s:223', 'aaa:111', 'asdasd:1111']
output = [word for word in list_ if len(word[:word.find(':')]) <= 3]
# output content: ['hsh:222', 's_s:223', 'aaa:111']

从我看来,您希望将output列表的内容写入文件f2。您可以按照以下步骤完成:
print(*output, file=f2, sep='\n')

你也可以使用if语句,如if word[4] == ':' - Joe Ferndz
哦,没错!那样会更加简洁。感谢你指出来。@JoeFerndz - revliscano

0

我不得不对我的答案进行一些编辑。您可以尝试使用这两行代码来获得相同的结果。假设每行至少有2个字符。

with open("xyz.txt", "r") as f, open("out.txt", 'w') as f2:
    for x in f:
        if x[3] == ':': f2.write(x)

以下代码将解决这个假设。无论每行的长度如何,它都应该能够读取文件。
import re
with open("xyz.txt", "r") as f, open("out.txt", 'w') as f2:
    for x in f:
        if re.search('^...:',x): f2.write(x)

正则表达式将检查 x 的值是否以任意 3 个字符开头,后跟冒号 (:)。如果是,则该行准备写入文件。

我的输入文件 xyz.txt 包含以下记录。

hsh:222
shhhshshs:2294
sjasda:2324
s_s:223
aaa:111
asdasd:1111
a:

输出文件 out.txt 中有以下记录。

hsh:222
s_s:223
aaa:111

如果您想检查以下模式中的任何字符串: :123 a:123 aa:123 aaa:123 其中a可以是任何字符,那么您可以按照以下方式更改代码:
with open("xyz.txt", "r") as f, open("out.txt", 'w') as f2:
    for x in f:
        if ':' in x[:3] : f2.write(x)

这里将检查前4个位置中是否有:

您可以按以下方式使用正则表达式编写:

import re
with open("xyz.txt", "r") as f, open("out.txt", 'w') as f2:
    for x in f:
        if re.search('^.{0,3}:',x): f2.write(x)

如果输入文件如下:
hsh:222
shhhshshs:2294
sjasda:2324
s_s:223
aaa:111
asdasd:1111
a:
:1

输出结果如下:

hsh:222
s_s:223
aaa:111
a:
:1

OP允许<3个字符。虽然方法巧妙。 - Mad Physicist
@MadPhysicist,感谢提醒。我使用正则表达式在第四个位置搜索冒号。请检查并告诉我是否有任何挑战。非常感谢您的意见,并推动我得出一个无懈可击的答案。 - Joe Ferndz
我认为你没有理解重点。首先,在第一个假设中,至少有4个字符,而不是2个。其次,你应该测试 if ':' in x[:3]。正则表达式应该是 ^.{1,3}: - Mad Physicist
如果您使用 re.match,则不需要 ^ - rioV8
如果我不使用^,那么它将匹配带有“...:”的任何字符串。例如,如果字符串是“abcd:123”,则也会选择此字符串。 - Joe Ferndz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接