我对Python Regex相当陌生,无法理解以下内容:
我在找一个用三个大写字母围起来的小写字母。你知道吗
我的第一个问题是下面的正则表达式只给出一个匹配项,而不是当前的两个匹配项['AbAD', 'DaDD']
>>> import re
>>>
>>> # String
... str = 'AbADaDD'
>>>
>>> pat = '[A-Z][a-z][A-Z][A-Z]'
>>> regex = re.compile(pat)
>>>
>>> print regex.findall(str)
['AbAD']
我猜上面的原因是第一个正则表达式中的最后一个D
不能再匹配了?有没有办法关闭这种匹配。你知道吗
第二个问题是以下正则表达式:
>>> import re
>>>
>>> # String
... str = 'AbADaDD'
>>>
>>> pat = '[^A-Z][A-Z][a-z][A-Z][A-Z][^A-Z]'
>>> regex = re.compile(pat)
>>>
>>> print regex.findall(str)
[]
基本上我想要的是一个小写字母周围不能超过三个大写字母,因此我在它们周围放置了一个负号。但是['AbAD']
应该是匹配的,但是它没有得到匹配。有什么想法吗?你知道吗
主要是因为比赛的重叠。只要把正则表达式放在一个lookahead中,就可以处理这种类型的重叠匹配。你知道吗
代码:
DEMO
对于第二个,您应该使用如下所示的负向前看和向后看断言
代码:
DEMO
第二个正则表达式的问题是,
[^A-Z]
使用一个字符(在第一个A
之前没有除大写字母以外的字符),但是(?<![A-Z])
后面的负数也会使用同样的字符,但它不会使用任何字符。它断言匹配的前面将有任何大写字母,但不是大写字母。这就是为什么你找不到匹配的。你知道吗第1期,
你应该用这个模式
示例
第二期
你应该使用
示例
正则表达式的问题是,它在处理字符串的过程中会把字符串吃光,而在第二个过程中什么也没有留下匹配。使用向前看,确保它不会吃掉绳子。你知道吗
对于第二个正则表达式,再次执行相同的操作。你知道吗
print re.findall(r"(?=([A-Z][a-z][A-Z][A-Z](?=[^A-Z])))",s)
。有关更多信息,请参阅
1)第一次匹配后,左边的字符串是
aDD
,因为第一部分已经匹配。你知道吗2)
aDD
不满足pat = '[A-Z][a-z][A-Z][A-Z]'
。因此它不是匹配的一部分。你知道吗相关问题 更多 >
编程相关推荐