首页 > 解决方案 > 从一个文本文件中提取行并使用正则表达式将它们放入两个不同的文本文件中?#Python

问题描述

我使用的语言是 python

问题是:编写一个带有一个参数(文件名)的函数。文件包含各种文本行,有时还包含电话号码(即并非所有行都包含电话号码)。逐行读取给定文件并在其中搜索电话号码(使用正则表达式),如果给定行中存在电话号码,则将此行写入phone-number- contains-lines.txt,否则将此行写入plain-lines。文本。结果,一些行将在一个文件中,而其他行将在第二个文件中。

这是我想出的代码:

import re

f1 = open('phonenumber.txt', 'r')
regex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

for line in f1:
    phone_numbers = regex.findall(line)
    for num in phone_numbers:
        f = open('phone-number-containing-lines.txt', 'w')
        f.writelines(num)
        f.close()

f2 = open('phonenumber.txt','r')    
searchquery = re.compile(r'^[^\d]*$')

for line in f2:
    plain_text = regex.findall(line)
    for txt in plain_text:
        d = open('plain-lines.txt', 'w')
        d.writelines(txt)
        d.close()

我没有收到任何错误,但我也只是得到了 phone-number-containing-lines.txt 只有一个电话号码,没有来自该行的文本,而 plain-lines.txt 完全空的

标签: python-3.xregexfile

解决方案


你的问题:

用它打开文件的每种类型都会w重写它。所以你只得到包含电话号码的最后一行。

解决方案:

您可以使用afor append 打开它,但这不会有效。您应该打开该文件一次。持久,考虑使用,re.search()而不是re.findall因为你关心的只是线路是否包含电话号码。如果线路包含多个电话号码,您当前的解决方案会将线路多次正确输出:

import re

PATTERN = re.compile(r'[0-9]{3}-[0-9]{3}-[0-9]{4}')

with open('phonenumber.txt') as f1, open('phone-number-containing-lines.txt', 'w') as f2:
    for line in f1:
        if PATTERN.search(line):
            f2.write(line)

相关内置 open 函数中模式 a、a+、w、w+ 和 r+ 之间的区别?


推荐阅读