【问题标题】:Extract specific words from text in python using regular expression使用正则表达式从python中的文本中提取特定单词
【发布时间】:2020-06-09 07:28:19
【问题描述】:

例如,我有以下文字:

[ABC]something
    foo 25
    bar 20

[DEF]something
    foo 50

.....和其他类似的文字

我想从括号中提取三个单词 foo 和 bar 以及数字,这样我就可以得到 re.findall 的结果,如下所示 [('ABC', 'foo 25', bar 20'), ('DEF', 'foo 50')]

我尝试了以下模式,但在列表中返回了许多空字符串

\[(\w+)\]|\n\s+(\w+\s\d+)

【问题讨论】:

  • 同时使用两个表达式或一个解析器。

标签: python python-3.x regex


【解决方案1】:

你可以使用

import re

data = """
[ABC]something
    foo 25
    bar 20

[DEF]something
    foo 50
"""

rx_outer = re.compile(r'''
    ^
    \[(?P<section>[^][]+)\]
    (?P<content>(?:.+[\r\n]?)+)
    ''', re.M | re.X)

rx_inner = re.compile(r'\w+\s+\d+')

result = []
for outer in rx_outer.finditer(data):
    section = outer.group('section')
    values = tuple([value.group(0) for value in rx_inner.finditer(outer.group('content'))])
    result.append((section,) + values)

print(result)

或者 - 作为列表理解:

result = [(section,) + tuple([value.group(0) for value in rx_inner.finditer(outer.group('content'))])
          for outer in rx_outer.finditer(data)
          for section in [outer.group('section')]]

print(result)

机器人会屈服

[('ABC', 'foo 25', 'bar 20'), ('DEF', 'foo 50')]

查看"outer"inner 表达式的演示,剩下的就是编程逻辑。

【讨论】:

  • 谢谢,但是复制了 'ABC'.. 我希望它是 ('ABC', 'foo 25', 'bar 20') ?
  • @user13711798:啊,等一下。
  • 谢谢。有效。但这对我来说似乎更先进。我期待直接从 re.findall 获得结果。在此期间,我将尝试学习这一点。也很抱歉,它不会让我投票:(。
猜你喜欢
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多