我想打印特定字符串之间的行,我的字符串如下:
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之间的界限。
答案 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