2012-03-26 27 views

回答

3

无需使用正则表达式:

>>> s = "Name: John, Name: Abby, Name: Kate" 
>>> [x[len('Name: '):] for x in s.split(', ')] 
['John', 'Abby', 'Kate'] 

甚至:

>>> prefix = 'Name: ' 
>>> s[len(prefix):].split(', ' + prefix) 
['John', 'Abby', 'Kate'] 

现在,如果你仍然认为正则表达式是比较合适的:

>>> import re 
>>> re.findall('Name:\s+([^,]*)', s) 
['John', 'Abby', 'Kate'] 
1

有趣的问题是如何你可以选择使用Python来做这件事的方法之一。如果你确信格式准确,使用“分割”的答案很好。如果您希望对较小的格式更改提供一些保护,则正则表达式可能会有用。您应该考虑格式中哪些部分最可能稳定,并将其捕获到正则表达式中,同时为其他部分留出灵活性。这里是假设由字母一个例子,这个词“名称”和结肠稳定:

import re 
s = "Name: John, Name: Abby, Name: Kate" 
names = [i.group(1) for i in re.finditer("Name:\s+([A-Za-z]*)", s)] 
print names 

你可能反而要允许连字符或其他字符的名称内;你可以通过改变[A-Za-z]中的文字来实现。

关于Python正则表达式的一个很好的例子有很多例子,http://docs.python.org/howto/regex.html

+0

列表理解完全等同于're.findall(“Name:\ s +([A-Za-z] *)”,s)' – 2012-03-26 23:50:57

+0

好点。我考虑过使用findall。我个人发现自己更频繁地使用finditer,因为工作是通过并为每个找到的元素做些事情,所以我选择在示例中使用finditer,尽管这里的列表理解有点奇怪。 – 2012-03-27 21:12:54

1

很少有更多的方式来做到这一点

>>> s 
'Name: John, Name: Abby, Name: Kate' 

方法1:

>>> [x.strip() for x in s.split("Name:")[1:]] 
['John,', 'Abby,', 'Kate'] 

方法2:

>>> [x.rsplit(":",1)[-1].strip() for x in s.split(",")] 
['John', 'Abby', 'Kate'] 

方法3:

>>> [x.strip() for x in re.findall(":([^,]*)",s)] 
['John', 'Abby', 'Kate'] 

方法4:

>>> [x.strip() for x in s.replace('Name:','').split(',')] 
['John', 'Abby', 'Kate'] 

另外请注意,我怎么能始终一致地应用带这是有道理的,如果他们能之间的多个空格“姓名:”令牌和实际名称。

方法2和3可以以更通用的方式使用。