【问题标题】:Split a string and capture all instances in python regex拆分字符串并捕获 python 正则表达式中的所有实例
【发布时间】:2022-07-06 22:47:17
【问题描述】:

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

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

一些例子:

------------String ------Contains------------要提取的名称

  • 'RangersIslandersDevils' --> 3 个名字 ->>> [Rangers, Islanders, Devils]
  • '49ersRaiders' -------------> 2 个名字 ->>> [49ers, Raiders]
  • 'Avalanche'----------------> 1 个名字 ->>> [Avalanche]
  • '红翼'---------------> 1 个名字 ->>> [红翼]

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

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

  1. 开始扫描预计以大写字母开头的文本 字母或数字
  2. 如果您看到文字“s”后跟一个大写字母(如 ...s[A-Z]..),请捕获文本直到“s”(包括 s)
  3. 重复第二步,直到看不到 (....s[A-Z]..) 模式。并将字符串的其余部分作为姓氏捕获。
  4. (可选)将所有名称写在一个列表中

好吧,我尝试了一些代码,其中第二步只捕获一个实例,而第三步通常给出另一个实例,但这是徒劳的。

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

只返回两个名字:

[('RangersIslandersMols', '恶魔')]

而我想要四个:

[游骑兵、岛民、摩尔人、恶魔]

【问题讨论】:

  • 用目前的方法让 Red Wings 用一个名字而不是 2 个名字似乎是不可能的
  • 特别是如果你得到类似'Red RangersIslanders'的东西。现在结果应该是“Red Rangers”和“Islanders”这两个字符串吗?

标签: python regex regex-group python-regex


【解决方案1】:

我认为这太复杂了,为什么不试试这种方法:

import re

test = [
    'RangersIslandersDevils',
    '49ersRaiders',
    'Avalanche',
    'Red Wings',
    'RangersIslandersMolsDevil'
]

for word in test:
    print(re.findall('.[^A-Z]*', word))

['Rangers', 'Islanders', 'Devils']
['49ers', 'Raiders']
['Avalanche']
['Red ', 'Wings']
['Rangers', 'Islanders', 'Mols', 'Devil']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2020-06-16
    • 2019-07-24
    • 1970-01-01
    相关资源
    最近更新 更多