拆分字符串并捕获python regex中的所有实例



新手在这里,我一直试图学习正则表达式一段时间,但有时我觉得我不能理解正则表达式是如何处理字符串。因为在计划阶段,我似乎解决了问题,但在实施过程中,它并没有像我期望的那样工作。

这是我的小问题:我有一个字符串包含一个或多个名称(团队名称)。问题是,如果字符串包含多个,则没有分隔符。所有名称直接联合

一些例子:

------------ 字符串 ----------------- 包含 ---------- 名字中提取

  • "RangersIslandersDevils"——比;3个名字->>>[游骑兵,岛民,魔鬼]
  • 49 ersraiders
  • " ' -------------& gt;2个名字->>>(49人队,掠夺者)
  • 的雪崩 '----------------& gt;1名->>>(雪崩)
  • "红色翅膀 '---------------& gt;1名->>>(红色的翅膀)

我想捕获每个字符串中的每个名称,并在稍后的循环中使用它们。但我似乎无法实现我为它设想的模式。

我脑海中字符串的模式实现是这样的:

  1. 开始扫描希望以大写字母开头的文本字母或数字
  2. 如果您看到文字's'后面跟着一个大写字母(如…s[a - z]..),则捕获文本直到" "(包括年代)
  3. 重复第二步,直到你不再看到(....s[A-Z]..)模式。并捕获字符串的其余部分作为姓氏。
  4. 可选,在列表中写入所有名称

我徒劳地尝试了一些代码,其中步骤2只捕获一个实例,而步骤3通常会给出另一个实例。

re.findall('([A-Z0-9].*s)*([A-Z].*)+', 'RangersIslandersMolsDevil')

只返回两个名字:

[("RangersIslandersMols"、"魔鬼")]

而我想要四个

[游骑兵,岛民,鼹鼠,魔鬼]

([A-Z0-9].*s)*将捕获尽可能多的任何字符,因此这会导致'RangersIslandersMols'被粘在一起作为一个匹配。

听起来像是团队名称之间的边界被定义为一个小写字母(不一定是's',就像'Avalanche')后面紧跟着一个大写字母或数字,所以我们的模式应该寻找:

  • 大写字母或数字,后面跟着
  • 小写字母

因为一个团队名可以有多个单词,所以我们还将查找后面跟着与上面相同的模式的空格,以查找任何可能的单词数量。

试试这个模式:

>>> pattern = r'[A-Z0-9]+[a-z]+(?: [A-Z0-9]+[a-z]+)*'
>>> findall(pattern, "RangersIslandersDevils49ersWashginton Football TeamAvalancheWarriors")
['Rangers', 'Islanders', 'Devils', '49ers', 'Washginton Football Team', 'Avalanche', 'Warriors']

最新更新