我有一个格式字符串:

my_string = 'hello|foo world|foo how|bar are|bar you|bar today|foo'

我想返回一个列表,其中foo后面的所有连续单词都分组在同一个字符串中,但中间有"| bar"单词的单词在单独的字符串中.如果我try 重复前瞻:

re.findall(r'(\w+(?=\|foo\b))+',my_string)

退货

['hello', 'world', 'today']

但我想回来的是

['hello world', 'today']

因为"hello"和"world"并没有被一个非foo单词隔开.

在我真正的问题中,后跟"foo"的单词序列在正在搜索的字符串中出现的次数是未知的,"bar"可能是几种不同的模式.

我可以通过几个替换来解决这个问题,首先用拆分指示器替换所有非foo模式,然后在此基础上拆分,然后删除foo和剥离空间:

bars_removed = re.sub('(\w+\|(?!foo)[a-z]+ )+','split_string',my_string)
only_foo_words = [re.sub('\|foo','',x).strip() for x in bars_removed.split('split_string')]

which 退货 the desired result, but I feel like there's a way to do this using findall or maybe finditer that I'm missing.

推荐答案

您不能"排除"捕获到同一组中的其他文本之间的文本.

您需要用消费模式替换先行模式,提取所有连续的匹配,然后仅使用str.replace方法删除|foo作为后处理步骤.

final_list = [x.replace('|foo','') for x in re.findall(r'\w+\|foo(?:\s+\w+\|foo)*', my_string)]

参见the regex demo.

Details:

  • \w+-一个或多个单词字符
  • \|foo-|foo字符串
  • (?:\s+\w+\|foo)* - a non-capturing group matching zero or more sequences of
    • \s+-一个或多个空格
    • \w+\|foo-一个或多个单词字符,然后是|foo字符串.

Python-3.x相关问答推荐

我在创建Pandas DataFrame时感到困惑

如何有效地计算Kernel/Matrix

如何使用TensorFlow Keras子类化来构建和训练模型

Pandas -我们如何在一行中应用多个要求

基于另一个数据帧计算总和

在 sum() 中将字符串转换为 int (或 float)

Django在POST到外部URL时如何进行CSRF保护? 更新

如何对具有多个列值的 pandas 数据框进行数据透视/数据透视表

Pandas matplotlib:条形图占总数的百分比

使用 GEKKO 使用代码解决最佳时间控制问题时出现 IndexError

Pygame 错误地渲染等距图像

使用 Python 解析 JSON 嵌套字典

在 Python 3.5 中使用 aiohttp 获取多个 url

使用 python 正则表达式匹配日期

如何模拟 Django 模型对象(及其方法)?

Python过滤器函数 - 单个结果

迭代dict值

Tensorflow:ImportError:libcudnn.so.7:无法打开共享对象文件:没有这样的文件或目录

为什么 2to3 将 mydict.keys() 更改为 list(mydict.keys())?

如何删除目录? os.removedirs 和 os.rmdir 是否只用于删除空目录?