使用正则表达式启动和停止

时间:2011-05-11 23:31:57

标签: python regex

在我的程序中,我使用正则表达式直到单词break,然后我再次使用它直到单词stop。该计划的第一部分采用比赛并将其从军事时间转换为常规时间。第二部分将军事时间除以用户输入的数字。我的代码有效,但我使用了正则表达式两次。怎么可能改变我的程序所以我只使用一次正则表达式。

 with open(filename) as text:
        for line in text:
            pattern = re.search(r'((((2)([0-3]))|(([0-1])([0-9])))([0-5])([0-9]))', line)

            if pattern:

            if re.match("BREAK", line):
                break

        for line in text:
            m= re.search(r'((((2)([0-3]))|(([0-1])([0-9])))([0-5])([0-9]))', line)
            if m:

            if re.match("STOP", line):
                break   

2 个答案:

答案 0 :(得分:5)

首先,你的正则表达式r'((((2)([0-3]))|(([0-1])([0-9])))([0-5])([0-9]))'中包含了大量的括号。

据推测,您没有使用如此创建的捕获组。您似乎想要匹配HHMM,其中HH是00到23而MM是00到59。

r'(2[0-3]|[01][0-9])[0-5][0-9]将完成同样的工作。您可以通过执行r'(?:2[0-3]|[01][0-9])[0-5][0-9]'来避免剩余的捕获组。

您可能希望避免虚假匹配(例如“blah 23456789”中的“2345”)(例如)在模式的每一端都有\b

以下是代码的替代品:

import re
searcher = re.compile(r'\b(?:2[0-3]|[01][0-9])[0-5][0-9]\b').search
with open(filename) as text:
        for line in text:
            m = searcher(line)
            if m:
                do_something_1(line, m)
            if line.startswith("BREAK"): # equivalent to your code; is that what you really mean??
                break
        for line in text:
            m = searcher(line)
            if m:
                do_something_2(line, m)
            if line.startswith("STOP"): # equivalent to your code; is that what you really mean??
                break   

答案 1 :(得分:2)

最简单的是使用

my_re = re.compile("your regex")
my_re.search(some_string)
my_re.search(some_other_string)

这避免了两次定义正则表达式。

根据文档的内容,您可以拆分“BREAK”或匹配多个,很难知道,而不会看到示例或更多定义。