有一种方法可以使用 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/file1
or##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