Python 2.7。使用正则表达式从字符串的某些部分提取数据

标签 python regex python-2.7

让我们导入一个正则表达式。

import re

假设有一个包含一些数据的字符串。

data = '''Mike: Jan 25.1, Feb 24.3, Mar 29.0
   Rob: Jan 22.3, Feb 20.0, Mar 22.0
   Nick: Jan 23.4, Feb 22.0, Mar 23.4'''

例如,我们只想提取 Rob 行的 float 。

name = 'Rob'

我会这样做:

def data_extractor(name, data):
    return re.findall(r'\d+\.\d+', re.findall(r'{}.*'.format(name),data)[0])

输出为['22.3', '20.0', '22.0']

我的方式是Pythonic还是应该以某种方式改进?它完成了这项工作,但我不确定此类代码是否合适。

感谢您的宝贵时间。

最佳答案

一种非正则表达式方法包括分割行并修剪它们,然后检查哪一个以 Rob 开头,然后获取所有浮点值:

import re
data = '''Mike: Jan 25.1, Feb 24.3, Mar 29.0
   Rob: Jan 22.3, Feb 20.0, Mar 22.0
   Nick: Jan 23.4, Feb 22.0, Mar 23.4'''
name = 'Rob'
lines = [line.strip() for line in data.split("\n")]
for l in lines:
    if l.startswith(name):
        print(re.findall(r'\d+\.\d+', l))
# => ['22.3', '20.0', '22.0']

查看Python demo

如果您想使用纯粹的正则表达式方式,您可以使用 PyPi regex 模块和基于 \G 的正则表达式:

import regex
data = '''Mike: Jan 25.1, Feb 24.3, Mar 29.0
   Rob: Jan 22.3, Feb 20.0, Mar 22.0
   Nick: Jan 23.4, Feb 22.0, Mar 23.4'''
name = 'Rob'
rx = r'(?:\G(?!\A)|{}).*?(\d+\.\d+)'.format(regex.escape(name))
print(regex.findall(rx, data))

请参阅online Python demo

此模式匹配:

  • (?:\G(?!\A)|{}) - 最后一次成功匹配的结尾或 name 内容
  • .*? - 除换行符之外的任何 0+ 个字符,尽可能少
  • (\d+\.\d+) - 第 1 组(仅返回值 findall)匹配 1+ 位数字,. 和1+ 位数字。

regex.escape(name) 将转义可能出现在 name< 中的 (, ) 等字符.

关于Python 2.7。使用正则表达式从字符串的某些部分提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45307655/

相关文章:

python - 异步Python程序中的条件if与twisted

python - 使用 psycopg2 将数据从 python 写入 postgreSQL 时遇到问题

python - 从其他数据集映射数据。 python Pandas

Python Split() 和 re.split()

javascript - JavaScript 中最大长度的正则表达式

Python 类/总是返回 0

python - torch 值错误 : optimizer got an empty parameter list

python - 使用掩码和正则表达式从数组中获取数字

regex - 查找/替换 : regex with some logic, 引号——从输入文件到输出文件,单遍

python-2.7 - Python mechanize 或任何其他库登录谷歌阅读组