正则表达式,只在字符串中间找到模式

时间:2016-02-25 09:17:19

标签: python regex

我正在使用python 2.6并试图在一个字符串中找到一堆重复的字符,让我们说一堆n,例如nnnnnnnABCnnnnnnnnnDEF。在字符串的任何位置,n的数量都可以变化。

如果我构造一个这样的正则表达式:

re.findall(r'^(((?i)n)\2{2,})', s)

我只能在字符串的开头找到不区分大小写的n的出现,这很好。如果我这样做:

re.findall(r'(((?i)n)\2{2,}$)', s)

我只能在序列的最后检测到那些。但是刚好在中间呢?

首先,我考虑使用re.findall(r'(((?i)n)\2{2,})', s)和前两个正则表达式(-ices?)来检查返回列表的长度以及n在开头或结尾的存在字符串并进行逻辑测试,但它很快变成了一个丑陋的if-else混乱。

然后,我尝试了re.findall(r'(?!^)(((?i)n)\2{2,})', s),这似乎是开头就好了,但正则表达式末尾的(?!$)(?!\z)只排除了n中的ABCnnnn {1}}。最后,我尝试re.findall(r'(?!^)(((?i)n)\2{2,})\w+', s)这似乎有时会起作用,但我会在其他人身上得到奇怪的结果。感觉我需要前瞻或后仰,但我无法绕过它们。

3 个答案:

答案 0 :(得分:3)

而不是使用复杂的正则表达式来拒绝匹配前导和尾随n字符。作为更强大的方法,您可以strip()使用n字符串,然后使用re.findall()和简单的正则表达式查找>>> s = "nnnABCnnnnDEFnnnnnGHInnnnnn" >>> import re >>> >>> re.findall(r'n{2,}', s.strip('n'), re.I) ['nnnn', 'nnnnn'] 的所有序列:

re.I

注意srand(101) # create a multidimensional array that will house 3 matrices of dimensions 2x2 A = Array(Array{Float64,2},3) # initialise array with zero matrices (is this the culprit?) fill!(A, zeros(2,2)) # populate array (some dummy computation to illustrate my problem) for ii=1:2 for jj=1:2 aux = randn(1,3) for dd=1:3 A[dd][ii,jj]=aux[dd] end end end Ignore-case 标志,它使正则表达式引擎匹配大写和小写字符。

答案 1 :(得分:2)

由于“n”是一个字符(而不是子模式),因此您只需使用:

re.findall(r'(?<=[^n])nn+(?=[^n])(?i)', s)

或更好:

re.findall(r'n(?<=[^n]n)n+(?=[^n])(?i)', s)

答案 2 :(得分:1)

注意 此解决方案假定n可能是某些字符的序列。如果n只有1个字符,请提供更有效的替代方案,请在此处查看其他答案。

您可以使用

(?<!^)(?<!n)((n)\2{2,})(?!$)(?!n)

请参阅regex demo

正则表达式将匹配不在开头(n)或结束(re.I的重复连续(?<!^) s(忽略可以使用(?!$)标志的情况) )字符串,而不是之前((?!n))或之后((?<!n))另一个n

(?<!^)(?<!n)是一系列2个外观:(?<!^)表示如果前面带有字符串,则不会使用下一个模式。如果前面带有(?<!n) ,则n否定后瞻意味着不会使用下一个模式。否定前瞻(?!$)(?!n)具有相似的含义:(?!$)如果在当前位置之后字符串结束发生且(?!n)将失败匹配,则n失败匹配在字符串中的当前位置之后(即,在匹配所有连续的n之后发生。必须满足环境条件,这就是为什么我们只得到最里面的匹配。

请参阅IDEONE demo

import re
p = re.compile(r'(?<!^)(?<!n)((n)\2{2,})(?!$)(?!n)', re.IGNORECASE)
s = "nnnnnnnABCnnnnnNnnnnDEFnNn"
print([x.group() for x in p.finditer(s)])