让我们导入一个正则表达式。
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']
如果您想使用纯粹的正则表达式方式,您可以使用 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))
此模式匹配:
(?:\G(?!\A)|{})
- 最后一次成功匹配的结尾或name
内容.*?
- 除换行符之外的任何 0+ 个字符,尽可能少(\d+\.\d+)
- 第 1 组(仅返回值findall
)匹配 1+ 位数字,.
和1+ 位数字。
regex.escape(name)
将转义可能出现在 name< 中的
.(
, )
等字符
关于Python 2.7。使用正则表达式从字符串的某些部分提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45307655/