Python-在字符串中当前和下一次出现模式之间获取内容

时间:2015-09-06 14:22:33

标签: python regex string

我想在python中实现以下内容

(1)在字符串中搜索模式

(2)获取内容,直到下一次出现相同的字符串

直到字符串结尾(1)和(2)

搜索了所有可用的答案但没有用。

提前致谢。

2 个答案:

答案 0 :(得分:0)

你可以使用这样的东西

re.findall(r"pattern.*?(?=pattern|$)",test_Str)

我们在这里搜索patternlookahead,确保它会抓到下一个patternend 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]对结果数组进行切片。

请注意,此方法有两点需要注意:

  1. re.split不会在空字符串匹配时拆分。

    >>> re.split('', 'abcabc')
    ['abcabc']
    
  2. 捕获组中的内容将包含在结果数组中。

    >>> re.split(r'(.)(?!\1)', 'aaaaaakkkkkkbbbbbsssss')
    ['aaaaa', 'a', 'kkkkk', 'k', 'bbbb', 'b', 'ssss', 's', '']
    
  3. 如果您需要处理这些用例,则必须使用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'包含在结果列表中)