2

我正在尝试使用正则表达式来解析以某种(key###value)格式编写的值。该值将始终是一个数字。无论如何,我认为用 python 来做是最简单的,所以这里有一些我正在尝试的代码:

import re

line = "(text 1###123)(text 2###345)";

matchObj = re.match( r'\(.*###[0-9]+\)', line)

if matchObj:
   print matchObj.group(0) # produces (text 1###123)(text 2###345)
   # print matchObj.group(1) # gives an error
else:
   print "No match!!"

即使有两个不同的对象与我编写的正则表达式匹配,python 还是将它们作为单个字符串返回给我——这不是我想要的。我怎样才能解决这个问题?

事实上,我真正想要的是将字符串分成类似["text 1", "123", "text 2", "345]. 因此,如果有人有一种简单的方法来实现这一点,我也将不胜感激。

4

2 回答 2

5

您没有正确的正则表达式,您需要有捕获组。您的示例已转义括号。这是您实际需要的正则表达式。?后面的使它*不贪心(这样它在仍然匹配的同时尝试尽可能少的字符)。

\((.*?)###([0-9]+)\)

您当前的正则表达式只有转义括号,因此您实际上没有任何捕获组。要获得所有匹配项,您需要使用re.findall. 但是如果您需要使用两个捕获组,这将产生如下内容:

regex = r'\((.*?)###([0-9]+)\)'
re.findall(regex, "(text 1###123)(text 2###345)") # [("text 1", "123"), ("text 2", "345")]

如果你想把它弄平,那也很简单。

于 2013-05-18T01:35:59.533 回答
1

在这个问题中,有几点正在发挥作用。

  1. 首先是做什么re.match()。这个函数实际上希望能够在字符串的开头开始匹配,在这种情况下它不能因为你在那里有一个左括号。因此,您将改为查看函数re.search(),并且更有可能查看re.findall()函数。
  2. 此外,您不需要像在其他语言中那样在 Python 中转义组。
  3. 您可能不想使用.*,因为这往往是贪婪的。虽然您可以侥幸逃脱.*?,但通常最好花时间为正则表达式提供更具体的搜索。

总而言之,我建议以下几点:

matchObj = re.findall(r'(([\w\d ]+)###(\d+))', line)

这将导致一个易于排序的数组:

>>> matchObj
[('text 1###123', 'text 1', '123'), ('text 2###345', 'text 2', '345')]
>>> matchObj[0]
('text 1###123', 'text 1', '123')
于 2013-05-19T02:48:22.290 回答