3

我想作为一个基本的 Python 正则表达式问题。我有一个数据集

line = "(1,2) (2,3)" 

那可以重复很多次所以线也可以

line = "(1,2) (3,4) (6,5)"

我有一个正则表达式

rx = "(\(\s*\d+\s*,\s*\d+\s*\)\s*){2,}$"

我想

a = re.match(rx,line).groups();

匹配

('(1,2)','(3,4)'...)

但我只能匹配最后一个(6,5)。我需要最后一个 $ 因为我不知道我可以有多少括号输入,否则输入不正确,例如

(1,2),(3,4),(5,6

将通过正则表达式。

有小费吗?

编辑:添加了数据未完全格式化为详细的事实。反而

line= 'blah(1,2) (2,3)blah'

所以确实需要正则表达式

谢谢

4

4 回答 4

6

看哪,没有正则表达式的魔力:

>>> "(1,2) (3,4) (6,5)".split()
['(1,2)', '(3,4)', '(6,5)']
于 2012-09-20T23:22:27.900 回答
4

如果您真的想使用正则表达式(我不是正则表达式专家,但它适用于给定的数据):

r = "[\(\d+,\d+\)]{1,}"
c = re.findall(r,line)

否则请按照nightcracker的出色建议。大多数情况下,最简单的答案是更好的答案。

编辑:感谢 Joran Beasley 的建议。

于 2012-09-20T23:26:09.037 回答
1

尝试使用re.findall(rx, line)

于 2012-09-20T23:22:55.603 回答
0

请注意,Borgleader 的回答导致:

>>> re.findall(r'[\(\d+,\d+\)]{1,}', '(1, 2),(2,3)')
['(1,', '2),(2,3)']

Joran Beasley 对上述案例的回答如下:

re.findall(r"(\([^)]*\))", '(1, 2),(2,3)')
['(1, 2)', '(2,3)']

但是太包容了:

>>> re.findall(r"(\([^)]*\))", '(1, blah2),(2,3)')
['(1, blah2)', '(2,3)']

如果您希望仅包含数字,则:

>>> re.findall(r'\(\s*\d+\s*,\s*\d+\s*\)', '(1, 2),(2,3)')
['(1, 2)', '(2,3)']
>>> re.findall(r'\(\s*\d+\s*,\s*\d+\s*\)', '(1, blah2),(2,3)')
['(2,3)']
>>> re.findall(r'\(\s*\d+\s*,\s*\d+\s*\)', '(1, 2),(2,3) (6, 5')
['(1, 2)', '(2,3)']

如果要删除最终结果中的任何空格:

>>> [x.replace(' ', '') for x in re.findall(r'\(\s*\d+\s*,\s*\d+\s*\)', '(1, 2),(2,3) (6, 5')]
['(1,2)', '(2,3)']

或者如果有标签等:

>>> sp = re.compile('\s')
>>> [sp.sub('', x) for x in re.findall(r'\(\s*\d+\s*,\s*\d+\s*\)', '(1, 2),( 2, 3 ) (6, 5')]
['(1,2)', '(2,3)']

当然,对你的数据集越简单越好。

于 2012-09-21T07:20:16.003 回答