我正在使用 python 的 re.findall 方法来查找输入字符串中某个字符串值的出现。 例如通过搜索“ABCdef”字符串,我有两个搜索要求。
- 查找以单个大写字母开头的字符串。
- 在 1 之后找到包含所有大写字母的字符串。
例如输入字符串和预期输出将是:
'美国' -- 输出:['美国']
'BObama' -- 输出:['B', 'Obama']
'Institute20CSE' -- 输出:['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'
?
最佳答案
首先您需要匹配 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]
外面的 +
量词默认是贪婪的,所以,它会自动匹配最大字符串,并且只会在最后一个 之前停止大写
字母表。
关于python - 排除匹配的字符串 python re.findall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14788302/