Python正则表达式匹配已匹配子字符串

2024-05-29 03:09:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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']应该是匹配的,但是它没有得到匹配。有什么想法吗?你知道吗


Tags: importrestring大写字母regexprintcompilepat
3条回答

主要是因为比赛的重叠。只要把正则表达式放在一个lookahead中,就可以处理这种类型的重叠匹配。你知道吗

(?=([A-Z][a-z][A-Z][A-Z]))

代码:

>>> s = 'AbADaDD'
>>> re.findall(r'(?=([A-Z][a-z][A-Z][A-Z]))', s)
['AbAD', 'DaDD']

DEMO

对于第二个,您应该使用如下所示的负向前看和向后看断言

(?=(?<![A-Z])([A-Z][a-z][A-Z][A-Z])(?![A-Z]))

代码:

>>> re.findall(r'(?=(?<![A-Z])([A-Z][a-z][A-Z][A-Z])(?![A-Z]))', s)
['AbAD']

DEMO

第二个正则表达式的问题是,[^A-Z]使用一个字符(在第一个A之前没有除大写字母以外的字符),但是(?<![A-Z])后面的负数也会使用同样的字符,但它不会使用任何字符。它断言匹配的前面将有任何大写字母,但不是大写字母。这就是为什么你找不到匹配的。你知道吗

第1期,

你应该用这个模式

 r'([A-Z]{1}[a-z]{1}[A-Z]{1})'

示例

>>> import re
>>> str = 'AbADaDD'
>>> re.findall(r'([A-Z]{1}[a-z]{1}[A-Z]{1})', str)
['AbA', 'DaD']

第二期

你应该使用

(?=(?<![A-Z])([A-Z]{1}[a-z]{1}[A-Z]{1}[A-Z]{1})(?![A-Z]))

示例

>>> import re
>>> str = 'AbADaDD'
>>> re.findall(r'(?=(?<![A-Z])([A-Z]{1}[a-z]{1}[A-Z]{1}[A-Z]{1})(?![A-Z]))', str)
['AbAD']

正则表达式的问题是,它在处理字符串的过程中会把字符串吃光,而在第二个过程中什么也没有留下匹配。使用向前看,确保它不会吃掉绳子。你知道吗

pat = '(?=([A-Z][a-z][A-Z][A-Z]))'

对于第二个正则表达式,再次执行相同的操作。你知道吗

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]'。因此它不是匹配的一部分。你知道吗

相关问题 更多 >

    热门问题