2013-04-22 39 views
0

我有一个变量字段,其中的字符串是存储这样的:捕捉所选择的字符串的一部分在python

Field= "In Field 'fieldname':(Value1) from (DC) to (deleted)" 

,或者它也可以是:

Field= "In Field 'fieldname':(Value1) has changed from (DC) to (1)" 

从存储在该串变量字段,我想通过两个不同的变量来捕获值(DC)和(删除)或(DC)到(1):

OldValue=DC 
NewValue=deleted 

OldValue=DC 
NewValue=1 

我是在Python中处理这个变量是这样的:

OldValue,NewValue=re.findall(r'\((\d+)\)',Field) 

但是这只捕获数字而不是字符串?谁能帮

+1

您是否考虑过使用现有的序列化格式而不是自己编写? – 2013-04-22 21:59:35

+0

我不明白? – hulk007 2013-04-22 22:00:37

+0

使用XML,JSON,YAML等...或其他一些预先存在的格式使得这种事情变得微不足道,因为格式已经很好定义,并且已经有大量现有的库用于读写这种格式。 – 2013-04-22 22:07:42

回答

0

\d正则表达式只匹配数字。为了匹配字母(\w)和数字(\d),最好的解决方案是两个字符类别([\d\w])。

注意:这也将捕获您的字符串中的(Value1)。你需要一些代码来过滤掉它;或者,只需修改所述元组:

ValueName, OldValue, NewValue = tuple(re.findall(r'\(([\d\w]+?)\)', Field)) 

注:

  1. +?改性剂[\d\w] S中的至少可能的非零数字匹配(不像+,它匹配最大可能的数目)。
  2. 需要tuple()re.findall返回的列表转换为左侧可以理解的元组。
+0

@ hulk007在我的Python(2.7.3)'re.findall'返回一个列表。如果你的Python是相同的,我会编辑它在 – michaelb958 2013-04-22 23:09:02

+0

对我来说它的Python 2.4.3,它给了我的价值,但与我写上面errroe – hulk007 2013-04-23 07:36:24

+0

如果're.findall'只返回2匹配,有一个问题与正则表达式或数据。我对问题中数据的测试显示我的正则表达式工作正常,在正则表达式中我找不到2.4.3和2.7.3之间的任何实质性差异,所以有些数据必须比问题中的复杂。 – michaelb958 2013-04-23 12:15:39

0

你可以改变你现有re是:

>>> re.search(r'from \((.*?)\) to \((.*?)\)$', Field).groups() 
('DC', 'deleted') 
+0

属性错误:'NoneType'对象没有属性'groups' – hulk007 2013-04-22 22:10:19