1

我有一个形式为:

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

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

我尝试发出这个命令:

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

但是它没有给出我的要求,而是将几个 [NUM : NAME : NUM] 聚集到 [.]+ 组中,这在这个正则表达式方面也是正确的,但不是我需要的。

任何帮助将非常感激。

4

2 回答 2

2

尝试这个:

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

?在之后添加+是非贪婪的。贪婪意味着+在仍然匹配的同时将尽可能多的字符,默认情况下是贪婪的。通过添加,?您告诉它是非贪婪的,这意味着+它将采用最少数量的字符来匹配。

如果 num、: 和 name 之间没有空格,上述方法将起作用。

如果有空格,则使用:

re.findall(r"\[[0-9]+ \: (.+?) \: [0-9]+\]", string)
于 2013-01-18T17:04:43.123 回答
1
  • 第一个问题是您已将其包含.在字符类中。所以,你失去了 的意义.,它只匹配一个 dot(.)

  • 其次,您没有考虑字符串中数字后面的空格。

  • .+第三,你需要在你的中心使用不情愿的量词。因此,将 - 替换([.]+)(.+?).

  • 第四,你不需要逃避你的colons (:).

你可以试试这个: -

>>> re.findall(r'\[[0-9]+[ ]*:(.+?):[ ]*[0-9]+\]', string)
6: [' NAME ', ' NAME ']
于 2013-01-18T17:03:34.307 回答