假设我有一个文本文件,其中每一行包含“1”或“-1”。如何搜索文件以检查文件是否包含至少一个“1”?
最初,我有以下内容。
if re.search(r'\b1', f.read()): return true
else: return false
但是,这不起作用,因为“-”不被视为字母数字字符串,如果文件不包含单个“1”,则返回 true。确定文件是否包含“1”的最佳方法是什么?
使用该re.MULTILINE
标志,^
将匹配行的开头(而不是仅主题的开头):
re.search(re.compile('^1', re.MULTILINE), f.read())
如果任何行以 . 开头,这将匹配1
。
请参阅http://docs.python.org/library/re.html#regular-expression-syntax
这种替代解决方案避免完全读取文件:
has_1 = any(line == "1" for line in f)
any('1' in line for line in file)
is one way without reading the entire file to memory.
A convoluted but possibly efficient way
fmap = mmap.mmap(open('file').fileno(), 0)
'1' in fmap
You can also run a re against the mmap'd file.
re.search('^1', fmap, re.M)
f = open("textfile.txt", "rb")
lines = f.readlines()
new_lines = [line.replace("-1", "") for line in lines]
for line in new_lines:
if "1" in line:
print "Damn right!"
break
只需使用列表理解:
>>> if not None in [ re.search( r"1", line ) for line in f.readlines() ] :
pass # <your code here>
如果“1”或“-1”总是出现在行首,那么您可以将正则表达式更改为:
^1
如果它们总是出现在行的中间/末尾,则使用:
[^-]1
如果它们有时出现在开头,有时出现在中间/结尾,那么您可以尝试以下操作:
^1|[^-]1
我没有测试过这些。特别是最后一个,我不确定优先级是否正确。
def thingy(contents):
return any(line.strip() == "1" for line in contents.splitlines())
thingy("1\n-1\n-1") # True
thingy("-1\n-1\n-1") # False
或者:
def thingy(contents):
for line in contents.splitlines():
if line.strip() == "1":
return True
return False