2013-01-18 155 views
1

取名字,我有以下形式的字符串:Python的正则表达式,从一个字符串

"[NUM : NAME : NUM]: [NUM : NAME : NUM]:..." 

我希望能够提取所有的名字出这个字符串。 NAME可以有任何字符,从字母到标点符号和数字。 NUM只是形式[0-9] +

我试着发出以下命令:

re.findall(r"\[[0-9]+\:([.]+)\:[0-9]+\]", string) 

而是让我的请求,它会帮了几个[NUM:NAME:NUM ]到[。] +组中,这在这个正则表达式中也是正确的,但不是我所需要的。

任何帮助将不胜感激。

回答

2

试试这个:

re.findall(r"\[[0-9]+\:(.+?)\:[0-9]+\]", string) 

添加后?+是非贪婪。贪婪意味着+将尽可能多的字符,而仍然匹配,并默认贪婪。通过添加?,您告诉它不是贪婪的,这意味着+将采用最少数量的字符进行匹配。

如果在num,:和name之间没有空格,上面的方法将工作。

如果有空格,则使用:

re.findall(r"\[[0-9]+ \: (.+?) \: [0-9]+\]", string) 
+0

完美地工作,谢谢Brian – Yarneo

1
  • 第一个问题是你已经封闭.一个字符类中。 因此,你已经失去了.的含义,它只能匹配 dot(.)

  • 其次,您不考虑 字符串中的数字之后的空格。

  • 第三,你需要在 中心用你的.+使用不情愿的量词。所以,用(.+?)替换 - ([.]+)。第三,你不需要逃避colons (:)

你可以试试这个: -

>>> re.findall(r'\[[0-9]+[ ]*:(.+?):[ ]*[0-9]+\]', string) 
6: [' NAME ', ' NAME '] 
+0

谢谢你罗希特,你的版本效果很好,和你的解释让我更好地理解正则表达式。 – Yarneo