如果我有一个字符串s = "Name: John, Name: Abby, Name: Kate"
。我如何提取Name:
和,
之间的所有内容。所以我想要有一个阵列a = John, Abby, Kate
正则表达式字符串提取元素
谢谢!
如果我有一个字符串s = "Name: John, Name: Abby, Name: Kate"
。我如何提取Name:
和,
之间的所有内容。所以我想要有一个阵列a = John, Abby, Kate
正则表达式字符串提取元素
谢谢!
无需使用正则表达式:
>>> 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']
有趣的问题是如何你可以选择使用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。
很少有更多的方式来做到这一点
>>> 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可以以更通用的方式使用。
列表理解完全等同于're.findall(“Name:\ s +([A-Za-z] *)”,s)' – 2012-03-26 23:50:57
好点。我考虑过使用findall。我个人发现自己更频繁地使用finditer,因为工作是通过并为每个找到的元素做些事情,所以我选择在示例中使用finditer,尽管这里的列表理解有点奇怪。 – 2012-03-27 21:12:54