我想在python中实现以下内容
(1)在字符串中搜索模式
(2)获取内容,直到下一次出现相同的字符串
直到字符串结尾(1)和(2)
搜索了所有可用的答案但没有用。
提前致谢。
答案 0 :(得分:0)
你可以使用这样的东西
re.findall(r"pattern.*?(?=pattern|$)",test_Str)
我们在这里搜索pattern
和lookahead
,确保它会抓到下一个pattern
或end of string
。
答案 1 :(得分:0)
正如评论中Blckknght所述,您可以使用re.split
来实现此目的。 re.split
保留a)字符串的开头和第一个匹配,b)最后一个匹配和字符串结尾以及c)不同匹配之间的所有空字符串:
>>> re.split('abc', 'abcabcabcabc')
['', '', '', '', '']
>>> re.split('bca', 'abcabcabcabc')
['a', '', '', 'bc']
>>> re.split('c', 'abcabcabcabc')
['ab', 'ab', 'ab', 'ab', '']
>>> re.split('a', 'abcabcabcabc')
['', 'bc', 'bc', 'bc', 'bc']
如果你只想保留c)模式的2个匹配项之间的字符串,只需用[1:-1]
对结果数组进行切片。
请注意,此方法有两点需要注意:
re.split
不会在空字符串匹配时拆分。
>>> re.split('', 'abcabc')
['abcabc']
捕获组中的内容将包含在结果数组中。
>>> re.split(r'(.)(?!\1)', 'aaaaaakkkkkkbbbbbsssss')
['aaaaa', 'a', 'kkkkk', 'k', 'bbbb', 'b', 'ssss', 's', '']
如果您需要处理这些用例,则必须使用finditer
编写自己的函数。
这是只有案例c)匹配的变体。
def findbetween(pattern, input):
out = []
start = 0
for m in re.finditer(pattern, input):
out.append(input[start:m.start()])
start = m.end()
return out
示例运行:
>>> findbetween('abc', 'abcabcabcabc')
['', '', '']
>>> findbetween(r'', 'abcdef')
['a', 'b', 'c', 'd', 'e', 'f']
>>> findbetween(r'ab', 'abcabcabc')
['c', 'c']
>>> findbetween(r'b', 'abcabcabc')
['ca', 'ca']
>>> findbetween(r'(?<=(.))(?!\1)', 'aaaaaaaaaaaabbbbbbbbbbbbkkkkkkk')
['bbbbbbbbbbbb', 'kkkkkkk']
(在最后一个示例中,(?<=(.))(?!\1)
匹配字符串末尾的空字符串,因此'kkkkkkk'
包含在结果列表中)