我是python的新手,需要帮助。我想从文本文件中提取数据,并且不知道如何以正确的方式处理它。
sample.txt的
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
data('unimportant', 'unimportant2');
data('user', 'Marcus');
data('fullname', 'Marcus Dwony');
data('birthday', '14.05.1981');
data('unimportant3', 'unimportant4');
data('unimportant5', 'unimportant6');
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam
我想提取data('SOME1','VALUE1');
字段并将值存储到名为user,fullname和birthday的新变量中。
我用正则表达式尝试。但不知道如何提取田地。
import re
with open ("sample.txt") as f_in:
for line in f_in:
if re.match(r"data\(\'(user|fullname|birthday)", line):
print(line)
这是任何帮助!
答案 0 :(得分:2)
尝试这样:
>>> f = open('your_file.txt')
>>> for x in f:
... k = re.search(r"'(user|fullname|birthday)', '(.*)'", x)
... if k:
... print "{} {}".format(k.group(1), k.group(2))
...
user Marcus
fullname Marcus Dwony
birthday 14.05.1981
注意match
匹配字符串的开头,但search
可以匹配字符串中的任意内容
答案 1 :(得分:0)
更改正则表达式,以便您拥有与数据值对应的组。
"data\('(user|fullname|birthday)',\s+'([!']+)'\)"
保留对re.match
返回的值的引用:它是MatchObject
。您可以从中提取第二组:
match = re.match(r"data\('(user|fullname|birthday)',\s+'([^']+)'\)", line)
if (not(match is None)):
print(match.group(2)
虽然这是解决问题的一种方法,但我强烈建议您使用其中一种已经存在的无数方便,定义明确且易于使用的数据格式,如JSON或YAML或任何适合您的想法。这样您就不必调试序列化/反序列化代码;你可以放入一个经过验证的第三方库来处理它。减少头痛。
答案 2 :(得分:0)
(?:data|-)\(\'(user|fullname|birthday)+\', \'(.*?)+\'\);
这个正则表达式应该可行。 http://www.regexr.com/3ab40
这将匹配但不会捕获“数据”字符串:(?:data|-)
这意味着引号之间的所有内容:\'(.*?)+\'
答案 3 :(得分:0)
for line in lines:
m = re.match(r'^data\s*\(\s*\'(user|fullname|birthday)\'\s*,\s*\'(.*)\'\s*\)\s*;$', line.strip())
if m:
print m.groups()
此解决方案处理大括号内/外的空间。