我正在使用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)
这似乎有时会起作用,但我会在其他人身上得到奇怪的结果。感觉我需要前瞻或后仰,但我无法绕过它们。
答案 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)])