2

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

  1. 查找从单个大写字母开始的字符串。
  2. 在 1 之后找到包含所有大写字母的字符串。

例如输入字符串和预期输出将是:

  • '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'

4

2 回答 2

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字母之前停止。

于 2013-02-09T12:51:23.910 回答
1

你可以使用这个正则表达式

[A-Z][a-zA-Z]*?(?=[A-Z][a-z]|[^a-zA-Z]|$)
于 2013-02-09T12:51:12.343 回答