所以我正在寻找方法来抓住"使用Python的文本文件的某个部分,当您只知道此特定文本之前和之后的内容时 。我想要像this这样的回答但是对于单行来说。例如,如果我有一个名为test.txt
的文本文件,如下所示:
This
is
my
test
file
然后我可以使用
with open('test.txt') as input_data:
for line in input_data:
if line.strip() == 'is':
break
for line in input_data:
if line.strip() == 'test':
break
print(line)
...这对于抓取my
很好,但是如果我的文本文件是一行,例如:
This is my test file
然后它不起作用。我不想通过字符串索引获取my
,因为我想要的东西只能基于知道该部分之前和之后的内容。我试着看了很多问题,但没找到任何东西。
谢谢!
答案 0 :(得分:2)
你可以用正则表达式得到它:
with open('test.txt') as input_data:
for line in input_data:
match = re.search(r' is (.*) test ', line)
if match:
print(line)
print(match.group(1))
第3行查找带有“is test”的模式,如果找到,它将首先打印整行,然后只打印“is”和“my”之间的字符串。我不确定你更喜欢哪一个。
编辑:更改正则表达式以包含“是”之前的空格,否则“此”也将匹配。由于没有必要,删除了前瞻和后瞻
答案 1 :(得分:1)
start = ' is '
end = ' test '
with open('test.txt') as input_data:
for line in input_data:
try:
start_index = line.index(start) + len(start)
end_index = line.index(end)
print line[start_index:end_index]
except ValueError:
print "not find in this line[%s]" % line.rstrip()
您可以使用index
查找起始字和结束字,然后获取子字符串
答案 2 :(得分:1)
看起来你想在" is"之间获取一些信息。并且"测试",然后正则表达式可以帮助你,像这样:
with open('test.txt') as input_data:
match = re.findall(r'\sis\s*(\w[\s\S]+?)\s*test', input_data.read())
for item in match:
print item
答案 3 :(得分:0)
让我们考虑一下这个测试文件:
$ cat testfile
This
is
my
test
file
this is your test file
获得两场比赛:
>>> import re
>>> re.findall(r'\bis\s+(.*?)\s+test\b', open('testfile').read())
['my', 'your']
如果我们想要确保文件已关闭,请务必使用with
:
>>> with open('testfile') as f:
... re.findall(r'\bis\s+(.*?)\s+test\b', f.read())
...
['my', 'your']