Rob*_*ots 9 python search file match
我搜索了一下,但我找不到任何帖子来帮助我解决这个问题,我发现类似但我无论如何都找不到任何解决这个问题的事情.
这是我的问题,我正在尝试让python脚本搜索文本文件,文本文件在列表中有数字,每个数字对应一行文本,如果raw_input匹配文本文件中的确切数字它打印整行文本.到目前为止它打印包含该数字的任何行.
问题的例子,用户类型20然后输出是每个东西包含一个2和一个0,所以我得到220 foo 200 bar等.我怎么能解决这个问题,所以它只是找到"20"
这是我的代码
num = raw_input ("Type Number : ")
search = open("file.txt")
for line in search:
if num in line:
print line
Run Code Online (Sandbox Code Playgroud)
谢谢.
The*_*inn 17
构建匹配行的列表 - 几种风格:
def lines_that_equal(line_to_match, fp):
return [line for line in fp if line == line_to_match]
def lines_that_contain(string, fp):
return [line for line in fp if string in line]
def lines_that_start_with(string, fp):
return [line for line in fp if line.startswith(string)]
def lines_that_end_with(string, fp):
return [line for line in fp if line.endswith(string)]
Run Code Online (Sandbox Code Playgroud)
构建匹配行的生成器(内存效率高):
def generate_lines_that_equal(string, fp):
for line in fp:
if line == string:
yield line
Run Code Online (Sandbox Code Playgroud)
打印所有匹配的行(首先找到所有匹配,然后打印它们):
with open("file.txt", "r") as fp:
for line in lines_that_equal("my_string", fp):
print line
Run Code Online (Sandbox Code Playgroud)
打印所有匹配的行(在我们找到它们时懒惰地打印它们)
with open("file.txt", "r") as fp:
for line in generate_lines_that_equal("my_string", fp):
print line
Run Code Online (Sandbox Code Playgroud)
生成器(由 yield生成)是您的朋友,尤其是对于不适合内存的大文件。
unu*_*tbu 10
要检查您将使用的完全匹配num == line.但是line有一个行尾字符,\n或者因为删除尾随换行符\r\n而不会出现这种情况.因此,它可以很方便在年底移除所有的空格与numraw_inputline
line = line.rstrip()
Run Code Online (Sandbox Code Playgroud)
with open("file.txt") as search:
for line in search:
line = line.rstrip() # remove '\n' at end of line
if num == line:
print(line )
Run Code Online (Sandbox Code Playgroud)
你应该使用正则表达式来找到你需要的一切:
import re
p = re.compile(r'(\d+)') # a pattern for a number
for line in file :
if num in p.findall(line) :
print line
Run Code Online (Sandbox Code Playgroud)
正则表达式会将一行中的所有数字作为列表返回,例如:
>>> re.compile(r'(\d+)').findall('123kh234hi56h9234hj29kjh290')
['123', '234', '56', '9234', '29', '290']
Run Code Online (Sandbox Code Playgroud)
所以你不匹配 '200' 或 '220' 为 '20'。