打印特定图案之间的界限

时间:2013-03-13 04:28:03

标签: python python-2.6

我想打印特定字符串之间的行,我的字符串如下:

my_string = '''
##start/file1
file/images/graphs/main
file/images/graphs
file/graphs

##start/new
new/pattern/symbol
new/pattern/

##start/info/version
version/info/main
version/info/minor

##start
values/key
values
...
... '''

在此字符串中,我想搜索“main”并将其打印为:

##start/file1/file/images/graphs/main
##start/info/version/version/info/main

我该怎么做? 我试图找到两个## start和搜索main之间的界限。

2 个答案:

答案 0 :(得分:0)

尝试类似:

def get_mains(my_string):
    section = ''

    for line in my_string.split('\n'):
        if line[0:7] == "##start":
            section = line
            continue
        if 'main' in line:
            yield '/'.join([section, line])

for main in get_mains(my_string):
    print main

答案 1 :(得分:0)

有一种方法可以使用Python的正则表达式解析器(简称正则表达式)来完成此操作。

基本上,正则表达式是用于搜索特定模式的字符串的整个语言。如果我有字符串'Hello, World',它将与正则表达式模式'llo, Wor'匹配,因为它包含一个ell后跟一个ell后跟一个o后跟一个逗号和一个空格和一个大写双 - 你和等等。从表面上看,它看起来就像子串测试。正则表达式的真正力量来自特殊字符。如果我再次使用字符串'Hello, World',它也会匹配模式'Hello, \w\w\w\w\w',因为\w是一个特殊字符,代表字母表中的任何字母(加上一些额外内容)。因此'Hello, Bobby''Hello, World''Hello, kitty'都匹配模式'Hello, \w\w\w\w\w',因为\w可以代表任何字母。还有更多这些“特殊字符”,它们都非常有用。要真正回答你的问题,

我构建了一个匹配

的模式
##start\textICareAbout
file_I_don't_care
file_I_don't_care
file_I_care_about\main

r'(##start{line}){line}*?(.*main)'.format(line=r'(?:.*\n)')

前导r使字符串成为原始字符串(因此我们不必加倍反斜杠换行符,请参阅链接的网页)。然后,括号中的所有内容都成为一个组。小组是我们希望以后能够回忆的文本。有两组。第一个是(##start{line}),第二个是(.*main)。第一组匹配以##start开头的任何内容并继续整行,所以像 ##start/file1##start/new 第二组匹配以main结尾的行,因为.*匹配除换行符之外的每个字符。在这两组之间有{line}*,这意味着'匹配任何完整的行,并匹配任意数量的'。所以把它们捆绑在一起,我们有: 匹配以##start开头的任何内容,然后我们匹配任意数量的行,然后匹配以main结尾的任何行。

import re

# define my_string here

pattern = re.compile(r'(##start{line}){line}*?(.*main)'.format(line=r'(?:.*\n)'))

for match in pattern.findall(my_string):
    string = match[0][:-1]  # don't want the trailing \n
    string += '/'
    string += match[1]
    print string

对于您的示例,它输出

##start/file1/file/images/graphs/main
##start/new/version/info/main

所以Regex非常酷,其他语言也有。它是一个非常强大的工具,你应该学习如何使用它here。 另外只是旁注,我使用.format函数,因为我觉得它看起来更干净,更容易阅读,所以 'hello{line}world'.format(line=r'(?:.*\n)')只会被评估为'hello(?:.*\n)world',并且会匹配

hello
Any Text Here. Anything at all. (just for one line)
world