非常一般的情况,但我一遍又一遍地试图解决它并且我发现提出的解决方案也有类似的问题。 (我认为这个案例应该对任何试图从大块代码或结构化文件(如日志)中提取特定信息集的人都有用)
示例字符串:
"123string1abcabcstring2123string3abc123string...nabc"
子字符串A:"123"
子串B:"abc"
让我们说我们想找到子串A和子串B之间的所有子串,但不是B和A之间或A和B之间但也包含B的那些子串(&#34) ;字符串1abc"不应打印)
控制台上打印的结果应如下所示:
string 1
string 3
string...n
答案 0 :(得分:1)
这非常适合正则表达式,特别是re.findall
以获得多个匹配项:
>>> s="123string 1abcabcstring 2123string 3abc123string...nabc"
>>> import re
>>> re.findall('123(.*?)abc', s)
['string 1', 'string 3', 'string...n']
这将获得123和abc之间的一系列字符。使用.*?
代替.*
非常重要,这样它才能匹配最短的字符串 - 即直到#34; abc"的第一次出现。否则它将匹配到最后一个" abc"在字符串中。
答案 1 :(得分:1)
re
模块是您遇到此类问题的朋友:
>>> import re
>>> s = "123string 1abcabcstring 2123string 3abc123string...nabc"
>>> s1 = "123"
>>> s2 = "abc"
>>> m = re.findall(s1+ "(.*?)"+ s2, s)
>>> m
['string 1', 'string 3', 'string...n']
这样你甚至可以将分隔字符串保存在变量中......
当然,如果分隔字符串包含特殊字符,则应对其进行转义。例如ab(
我会写s1 = "ab\("