在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:如果您确信下面所写答案的正确性,请接受它