排除匹配的字符串python re.findall

时间:2013-02-09 12:46:19

标签: python regex string text-processing

我正在使用python的re.findall方法在输入字符串中查找某些字符串值的出现。 例如从“ABCdef”字符串中搜索,我有两个搜索要求。

  1. 从单一大写字母开始查找字符串。
  2. 1找到包含所有大写字母的字符串。
  3. e.g。输入字符串和预期输出将是:

    • 'USA' -- output: ['USA']
    • 'BObama' -- output: ['B', 'Obama']
    • 'Institute20CSE' -- output: ['Institute', '20', 'CSE']

    所以我的期望来自

    >>> matched_value_list = re.findall ( '[A-Z][a-z]+|[A-Z]+' , 'ABCdef' )
    

    将返回['AB', 'Cdef']

    但这似乎并没有发生。我得到的是['ABC']作为返回值,它将正则表达式的后续部分与完整字符串匹配。

    那么我们有什么方法可以忽略找到的匹配。因此,'Cdef''[A-Z][a-z]+'匹配。正则表达式的第二部分(即'[A-Z]+')仅与剩余的字符串'AB'匹配?

2 个答案:

答案 0 :(得分:5)

首先,您需要匹配AB,后跟大写字母,然后是小写字母。或者在字符串的末尾。为此,您可以使用look-ahead

然后你需要匹配一个大写字母C,然后是多个小写字母def

所以,你可以使用这种模式:

>>> s = "ABCdef"
>>> re.findall("([A-Z]+(?=[A-Z][a-z]|$)|[A-Z][a-z]+)", s)
['AB', 'Cdef']

>>> re.findall("([A-Z]+(?=[A-Z][a-z]|$)|[A-Z][a-z]+)", 'MumABXYZCdefXYZAbc')
['Mum', 'ABXYZ', 'Cdef', 'XYZ', 'Abc']

正如@sotapme在评论中指出的那样,您也可以将上述正则表达式修改为: -

"([A-Z]+(?=[A-Z]|$)|[A-Z][a-z]+|\d+)"

添加了\d+,因为您还希望匹配数字,就像您的一个示例中一样。此外,他从前瞻的第一部分中删除了[a-z]部分。这是有效的,因为+外部的[A-Z]量词在默认情况下是贪婪的,因此,它会自动匹配最大字符串,并且只会在最后一个upper case字母表之前停止。

答案 1 :(得分:1)

您可以使用此正则表达式

[A-Z][a-zA-Z]*?(?=[A-Z][a-z]|[^a-zA-Z]|$)