我希望将金额与正则表达式匹配为印度货币而不用逗号

时间:2016-07-13 05:58:08

标签: python regex

我想匹配 Rs. 2000 , Rs.2000 , Rs 20,000.00 ,20,000 INR 200.25 INR.

等金额

输出应该是 2000,2000,20000.00,20000,200.25

我试过的正则表达式是

(?:(?:(?:rs)|(?:inr))(?:!-{0,}|\.{1}|\ {0,}|\.{1}\ {0,}))(-?[\d,]+    (?:\.\d+)?)(?:[^/^-^X^x])|(?:(-?[\d,]+(?:\.\d+)?)(?:(?:\ {0,}rs)|(?:\      {0,}rs)|(?:\ {0,}(inr))))

但是在金额之后,它与inrrs的数字不匹配 我想在Python中使用re库来匹配它。

3 个答案:

答案 0 :(得分:3)

我建议在内部使用带有捕获组的交替组,只匹配常量字符串值之前或之后的数字:

(?:Rs\.?|INR)\s*(\d+(?:[.,]\d+)*)|(\d+(?:[.,]\d+)*)\s*(?:Rs\.?|INR)

请参阅regex demo

模式说明

  • (?:Rs\.?|INR)\s*(\d+(?:[.,]\d+)*) - 分支1:
    • (?:Rs\.?|INR) - 匹配RsRs.INR ...
    • \s* - 后跟0 +空格
    • (\d+(?:[.,]\d+)*) - 第1组:一个或多个数字后跟0个逗号或点后跟1+位数的序列
  • | - 或
  • (\d+(?:[.,]\d+)*)\s*(?=Rs\.?|INR) - 分支2:
    • (\d+(?:[.,]\d+)*) - 第2组捕获与分支1中相同的号码
    • \s* - 零个或多个空格
    • (?:Rs\.?|INR) - 后跟RsRs.INR

示例代码:

import re
p = re.compile(r'(?:Rs\.?|INR)\s*(\d+(?:[.,]\d+)*)|(\d+(?:[.,]\d+)*)\s*(?:Rs\.?|INR)')
s = "Rs. 2000 , Rs.3000 , Rs 40,000.00 ,50,000 INR 600.25 INR"
print([x if x else y for x,y in p.findall(s)])

请参阅IDEONE demo

或者,如果您可以使用PyPi regex模块,则可以利用分支重置构造(?|...|...),其中每个模块都会重置捕获组ID分支:

>>> import regex as re
>>> rx = re.compile(r'(?|(?:Rs\.?|INR)\s*(\d+(?:[.,]\d+)*)|(\d+(?:[.,]\d+)*)\s*(?:Rs\.?|INR))')
>>> prices = [match.group(1) for match in rx.finditer(teststring)]
>>> print(prices)
['2000', '2000', '20,000.00', '20,000', '200.25']

您可以通过ID = 1访问每个分支中的捕获组(请参阅match.group(1))。

答案 1 :(得分:2)

虽然稍微超出范围,但 Matthew Barnett (具有以下能力)可以使用更新且更优越的 regex 模块。子程序和分支重置):

import regex as re

rx = re.compile(r"""
(?(DEFINE)
    (?<amount>\d[\d.,]+)    # amount, starting with a digit
    (?<currency1>Rs\.?\ ?)  # Rs, Rs. or Rs with space
    (?<currency2>INR)       # just INR
)

(?|
    (?&currency1)
    (?P<money>(?&amount))
|
    (?P<money>(?&amount))
    (?=\ (?&currency2))
)

""", re.VERBOSE)

teststring = "Rs. 2000 , Rs.2000 , Rs 20,000.00 ,20,000 INR 200.25 INR."
prices = [m.group('money') for m in rx.finditer(teststring)]
print prices

# ['2000', '2000', '20,000.00', '20,000', '200.25']

<小时/> 这使用子程序和分支重置(感谢@Wiktor!) 请参阅a demo on regex101.com

答案 2 :(得分:0)

另一个:

(([\d+\,]+)(\.\d+)?\s\w{3}|(\w+\.?)\s?[\d+\,]+(\.?\d+))