Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用正则表达式查找并复制一行_Python_Regex_Lines - Fatal编程技术网

在Python中使用正则表达式查找并复制一行

在Python中使用正则表达式查找并复制一行,python,regex,lines,Python,Regex,Lines,我是这个论坛的新手,如果我违反了任何论坛规则,我会提前编程并道歉。我对此进行了广泛的研究,但我找不到解决问题的方法 所以我有一个很长的文件,它有这样的一般结构: data=""" 20.020001 563410 9 20.520001 577410 20 21.022001 591466 9 21.522001 605466 120 23.196001 652338 2 25.278001 710634

我是这个论坛的新手,如果我违反了任何论坛规则,我会提前编程并道歉。我对此进行了广泛的研究,但我找不到解决问题的方法

所以我有一个很长的文件,它有这样的一般结构:

data="""
   20.020001    563410   9
   20.520001    577410  20
   21.022001    591466   9
   21.522001    605466 120
   23.196001    652338   2
   25.278001    710634   7
   25.780001    724690 144
   26.280001    738690   9
   26.782001    752746  40
   27.282001    766746   9
   27.784001    780802 140
   29.372001    825266   2
   31.458001    883674   7
   31.958002    897674   8
   32.458002    911674   9
   32.958002    925674  10

"""
我使用

with open("C:\blablabla\text.txt", 'r+') as infile:
data = infile.read()
现在我尝试使用正则表达式来查找以140到146结尾的所有行,因此我做了以下操作:

items=re.findall('.......................14[0-6]\n',data,re.MULTILINE)
for x in items:
    print x
这是可行的,但当我现在尝试复制包含正则表达式的行时

for x in items:
    if items in data:
        data.write(items)
我得到以下错误:

if items in data:
TypeError: 'in <string>' requires string as left operand, not list
如果数据中的项目:
TypeError:“in”需要字符串作为左操作数,而不是列表
我知道问题是什么,但我不知道如何解决它。当正则表达式的结果是列表时,如何向左操作数馈送字符串


非常感谢您的帮助

您只需分别处理每一行:

data = infile.readlines()
for line in data:
    if re.match('.......................14[0-6]\n', line):
        print line[:-1]

行的最后一个字符是尾随的换行符,它将被
print
语句包含的换行符复制。

您可以逐行读取文件:

data=""
with open("file.txt", 'r+') as infile:
    for line in infile:
        if (146 >= int(line.split()[-1]) >= 140) :
            data = data + line

print data

您的正则表达式可以进一步简化

re.findall('.*?14[0-6]\n')
为了克服你进一步的问题

items = re.findall('.*?14[0-6]\n',data)
result=""""""
for x in items:
     result+=str(x)
print result

对于固定格式的以空格分隔的文本块,选择
split
而不是
re
,通常是一个很好的解决方案-例如
line.split()
会将一行分割成单独的数字。然后,您只需检查最后一项,
line.split()[-1]
,是否在预期范围内。如果数据中的项:,为什么要检查
?您刚才不是从数据中提取了
项吗?还可以查看
csv
模块。这可能会使解析变得更容易您的正则表达式可以更好地写成
r.*?14[0-6]$”
@Suianne:如果您确信下面所写答案的正确性,请接受它