0

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

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。

4

2 回答 2

0

Try something like:

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
于 2013-03-13T04:39:02.733 回答
0

有一种方法可以使用 Python 的正则表达式解析器来执行此操作,简称为 regex。

基本上,正则表达式是用于在字符串中搜索某些模式的整个语言。如果我有字符串'Hello, World',它将匹配正则表达式模式'llo, Wor',因为它包含一个 ell 后跟一个 ell 后跟一个 o 后跟一个逗号和一个空格以及一个大写的 double-you 等等。从表面上看,它只是一个子字符串测试。正则表达式的真正强大之处在于特殊字符。如果我'Hello, World'再次拥有该字符串,它也与 pattern 匹配'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/file1or##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

所以正则表达式很酷,其他语言也有。这是一个非常强大的工具,您应该在这里学习如何使用它。也只是一个旁注,我使用 .format 函数,因为我认为它看起来更干净,更容易阅读,所以 'hello{line}world'.format(line=r'(?:.*\n)')只是被评估为'hello(?:.*\n)world',它会匹配

hello
Any Text Here. Anything at all. (just for one line)
world
于 2013-03-13T06:06:45.527 回答