我正在使用python的re.findall方法在输入字符串中查找某些字符串值的出现。 例如从“ABCdef”字符串中搜索,我有两个搜索要求。
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'
匹配?
答案 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]|$)