2016-07-22 39 views
1

提取值在Python中我可以做到以下几点:使用字符串方法格式()从字符串

who = "tim" 
what = "cake" 
print "{0} likes {1}".format(who, what) 

产生“蒂姆喜欢蛋糕”。

但是,由于我需要使用正则表达式,反操作并不那么简单。我的意思是,解析一串已知结构并提取我知道它包含的部分,并将它们存储到我的变量中。 这种提取我的执行:

import re 

expression = "([a-z]*) likes ([a-z]*)" 
input_line = "tim likes cake" 

who, what = re.search(expression, inputline).groups() 

这对参数的少量不够整齐,但相比于我的“理想逆”的理念,以格式()这对我来说两个主要缺点:

  • 提取的参数始终为字符串,需要将它们转换为带有额外行的浮点数。格式在内部处理所需的转换,从任何值到字符串。
  • 我需要为输入和输出定义不同的模板,因为正规表达式格式为“([az] *)likes([az] *)”的输入模板不能重复用于数据的“导出” ,格式化功能。

所以,我的问题是,做这样的函数存在,因为我们把它们打印字符串,随后会自动解析字符串并获得价值相同的方式几乎相同的语法像
“{ 0}喜欢{1}”。提取物(谁,什么,input_line =‘蒂姆喜欢蛋糕’)

我知道我可以创建我的自定义‘提取’功能,表现为期望的,但我不希望如果已经有一个可用,就创建它。

+0

那么...自然语言处理? –

+0

我认为这简单得多,因为给出了模板语句并指定了要提取的信息。一种选择是在空间中分割,并提取模板中用转义字符标记的部分。但是,再次,我正在寻找现有的选择,而不是自己做。 – rmhleo

回答

1
who = "tim" 
what = "cake" 
print "{0} likes {1}".format(who, what) 

这是可行的,因为你确切知道字符串中的谁和什么。如果是这样的话,你不需要正则表达式。字符串是字符的名单:)

def extract_who_what_from_string(string): 
    words = string.split(" ") 
    who = words[0] 
    what = words[-1] 
    return who, what 

什么比这更复杂的是,其实,自然语言处理和会很出我的范围。

1

这是一个想法。

import re 

template ="{0} likes {1}" 
str_re = r"\w+" 
re.search(template.format(str_re, str_re), ...) 

虽然,看起来凌乱

1

似乎有不被超越分裂字符串和铸造部件或使用re内置的解决方案。

这是一个有点古怪,因为格式可用于输入指定类型:"{0:03d}_{1:f}".format(12, 1)'012_3.000000',所以我不知道为什么没有"012_3.000000".extract("{0:03d}_{1:f}", [a, b]),但..也许只有人由C来希望这样的事情。

在任何情况下,您可能会发现parse module有用,如this建议的答案。