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

标签 python regex string text-processing

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

  1. 查找以单个大写字母开头的字符串。
  2. 在 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/

相关文章:

python - 如何在 rpm 构建中包含 pip 包

python - 将模型到线条的 bool 值更改为 True - Odoo v8

python - 如何在没有循环的情况下计算一维和二维数组之间的汉明距离

javascript - 正则表达式,用于删除括号两侧的空格

python - Python中的通配符匹配

python - 查找由 Pandas 中的列表元素组成的系列的模式

Python 正则表达式 - 贪婪量词并非在所有情况下都有效

regex - 正向超前无法按预期工作

c - 构建 C 不可变字符串库,如何处理剩余的 const char* 的?

C - 字符串数组和函数