如何清理Python文件(数字、模式)?

2024-09-27 19:25:45 发布

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

我有一个长文本格式如下:

2689 3015 worth n
1095 9183 worth prep
4659 1314 worthwhile a
4503 1394 worthy a
36 272345 would modal
3404 2077 wound n
4789 1263 wound v
3174 2319 wrap v
4257 1508 wrist n
223 41497 write v
1329 7309 writer n
1939 4727 writing n
2483 3390 written a
723 14274 wrong a
5771 930 wrong adv
5544 995 wrong n
5774 929 x-ray n
4424 1426 yacht n
1510 6360 yard n
5354 1056 yarn n

我的问题是:如何从这样一个文件中删除所有的数字,只留下n、v、a和adv这些单词?你知道吗

当我成功地删除了数字,将文件中的行添加到字符串中时,我对如何在这种情况下使用regex和只留下我想要的单词感到困惑。结果应该是:

worth
worthwhile
..

所以,没有字型结尾。你知道吗

我应该通过将这些单词粘贴到一个.txt文件中来获得它吗? 你会怎么做?你知道吗


Tags: 文件文本格式数字单词wrapprepwouldadv
3条回答

使用setfindall查找所有唯一元素

([^\s]+)(?=\s+(?:n|v|a|adv)$)

Regex Demo

Python代码

p = re.compile(r'([^\s]+)(?=\s+(?:n|v|a|adv)$)', re.MULTILINE)
test_str = "2689 3015 worth n\n1095 9183 worth prep\n4659 1314 worthwhile a\n4503 1394 worthy a\n36 272345 would modal\n3404 2077 wound n\n4789 1263 wound v\n3174 2319 wrap v\n4257 1508 wrist n\n223 41497 write v\n1329 7309 writer n\n1939 4727 writing n\n2483 3390 written a\n723 14274 wrong a\n5771 930 wrong adv\n5544 995 wrong n\n5774 929 x-ray n\n4424 1426 yacht n\n1510 6360 yard n\n5354 1056 yarn n"
print(set(re.findall(p, test_str)))

IDEONE DEMO

你需要正则表达式吗?如果单词不能包含空格,您可以只在空格上拆分,只保留第三个和第四个结果,print只保留第三个结果,例如

with open('inputfile.txt') as inf, open('wordsonly.txt', 'w') as outf:
    for line in inf:
        line = line.rstrip()
        if line:
            word, wordtype = line.split()[2:4]
            if wordtype in ('a', 'n', 'v', 'adv'):
                print(word, file=outf)

要删除所有不是a,adv,n,v的实例,可以使用下面的regex并替换为空字符串。你知道吗

第1步:

正则表达式:^\S+\s+\S+\s+\S+\s+(?!a|n|adv|v).*$

Regex101 Demo


第2步:

现在剩下的单词末尾有a,adv,n,v。现在,您可以使用这样的捕获组将整个字符串替换为单词。你知道吗

正则表达式:^\S+\s+\S+\s+(\S+)\s+(a|n|adv|v)$

替换为:替换为\1。你知道吗

Regex101 Demo

相关问题 更多 >

    热门问题