【问题标题】:Which regular expression will get all group matches between start regex and end regex in python?哪个正则表达式将获得python中开始正则表达式和结束正则表达式之间的所有组匹配?
【发布时间】:2018-07-12 18:23:21
【问题描述】:

我尝试在 python 中获取第一次出现的开始正则表达式和最后一次出现的结束正则表达式之间的所有组匹配。

这是一个(非常简化的)具体示例,我尝试获取所有由字母数字字符 + 空格 + 数字组成的字符串,并且在括号之间。结果应该是 ["B 2", "C 3", "D 4"],但我没有得到它的工作。

import re

s = "A 1 (B 2 C 3 D 4) E 5"

re.findall("(\w+\s\d+)", s)                   # ['A 1', 'B 2', 'C 3', 'D 4', 'E 5']
re.findall("(?<=\()(\w+\s\d+)", s)            # ['B 2']
re.findall("(\w+\s\d+)(?=\))", s)             # ['D 4']
re.findall("(?<=\()(\w+\s\d+)(?=\))", s)      # []

# desired result: ["B 2", "C 3", "D 4"]

我的尝试并没有限制搜索区域,而是自己修改组匹配的模式,我不想实现。

我将不胜感激。

最好的问候

AFeee

【问题讨论】:

  • slice可以帮你re.findall("(\w+\s\d+)", s)[1:-1]吗?
  • 很遗憾,没有,因为在实际用例中,我不知道受起始正则表达式和结束正则表达式限制的区域之前或之后的元素数量。我的问题中的示例非常简化。不过谢谢。

标签: python regex python-3.x pattern-matching regex-group


【解决方案1】:

这是一种方法。

演示:

import re

s = "A 1 (B 2 C 3 D 4) E 5"
m = re.search(r"\((?P<content>.*?)\)", s)
if m:
    val = m.group("content")
    print(re.findall(r"\w\s+\d", val))

输出:

['B 2', 'C 3', 'D 4']

如果括号中有多个值,那么

s = "A 1 (B 2 C 3 D 4) E 5 (X 2 Y 3 Z 4) V 4"
for m in  re.findall(r"\(.*?\)", s):
    print(re.findall(r"\w\s+\d", m))

输出:

['B 2', 'C 3', 'D 4']
['X 2', 'Y 3', 'Z 4']

【讨论】:

  • 是否可以在一个正则表达式中完成?
  • 对不起。我不确定如何在单个正则表达式中做到这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多