如果一个单词在Python中以非字母数字字符开头,我如何匹配?

时间:2012-07-10 15:19:36

标签: python regex

假设我有一个文本文件,其中每行包含“1”或“-1”。如何搜索文件以检查文件是否包含至少一个“1”?

最初,我有以下内容。

if re.search(r'\b1', f.read()): return true
else: return false

但是,这不起作用,因为' - '不被视为字母数字字符串,如果文件不包含单个'1'则返回true。确定文件是否包含“1”的最佳方法是什么?

6 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

any('1' in line for line in file)是一种不将整个文件读入内存的方法。

一种错综复杂但可能有效的方式

fmap = mmap.mmap(open('file').fileno(), 0)
'1' in fmap

您还可以针对mmap'd文件运行。

re.search('^1', fmap, re.M)

答案 2 :(得分:1)


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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

单纯列表理解:

>>> if not None in [ re.search( r"1", line ) for line in f.readlines() ] :
        pass # <your code here>

答案 5 :(得分:0)

如果“1”或“-1”始终出现在行的开头,那么您可以将正则表达式更改为:

 ^1

如果它们总是出现在行的中间/末尾,则使用:

[^-]1

如果它们有时发生在开始时,有时发生在中间/结尾,那么你可能会尝试类似:

^1|[^-]1

我没有测试过这些。最后一个,特别是,我不确定优先权是否正确。