Python正则表达式 - 条件匹配?

时间:2009-05-30 23:09:58

标签: python regex

我不知道这是否是正确的词,但我想提出一些可以从数学表达式中提取系数和指数的正则表达式。表达式将以'axB + cxD + exF'的形式出现,其中小写字母是系数,大写字母是指数。我有一个可以匹配它们的正则表达式,但我想知道我是否可以使用2个正则表达式,一个用于匹配系数,一个用于指数。有没有办法将数字与一边的字母匹配而不匹配字母? EG,'3x3 + 6x2 + 2x1 + 8x0'我需要得到     ['3','6','2','8'] 和     ['3','2','1','0']

3 个答案:

答案 0 :(得分:5)

您可以使用positive look-ahead来匹配其他内容。要匹配系数,您可以使用:

>>> s = '3x3+6x2+2x1+8x0'
>>> re.findall(r'\d+(?=x)', s)
['3', '6', '2', '8']

来自re模块的文档:

  

(?= ...)       匹配if ...匹配next,但不消耗任何字符串。   这称为先行断言。   例如,艾萨克(?=阿西莫夫)会   只有在跟随之后才匹配'Isaac'   通过'Asimov'。

对于指数,您可以改为使用positive look-behind

>>> s = '3x3+6x2+2x1+8x0'
>>> re.findall(r'(?<=x)\d+', s)
['3', '2', '1', '0']

再次,来自文档:

  

(?&lt; = ...)匹配,如果字符串中的当前位置前面有匹配   ......结束于当前位置。   这被称为积极的外观   断言。 (?&lt; = abc)def会找到一个   在abcdef中匹配,因为看起来很好   将备份3个字符并检查是否   包含的模式匹配。

答案 1 :(得分:1)

>>> import re
>>> equation = '3x3+6x2+2x1+8x0'
>>> re.findall(r'x([0-9]+)', equation)
['3', '2', '1', '0']
>>> re.findall(r'([0-9]+)x', equation)
['3', '6', '2', '8']

答案 2 :(得分:1)

另一种方法,没有正则表达式:

>>> eq = '3x3+6x2+2x1+8x0'
>>> op = eq.split('+')
['3x3', '6x2', '2x1', '8x0']
>>> [o.split('x')[0] for o in op]
['3', '6', '2', '8']
>>> [o.split('x')[1] for o in op]
['3', '2', '1', '0']