我想匹配 Rs 这样的金额。 2000 年,2000 卢比,20,000.00 卢比,20,000 印度卢比 200.25 印度卢比。
输出应该是 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))))
但不是匹配金额后有inr
或rs
的数字
我想使用 Python 中的 re 库来匹配它。
最佳答案
我建议在内部使用带有捕获组的交替组,以仅匹配常量字符串值之前或之后的数字:
(?:Rs\.?|INR)\s*(\d+(?:[.,]\d+)*)|(\d+(?:[.,]\d+)*)\s*(?:Rs\.?|INR)
参见 regex demo .
模式解释:
(?:Rs\.?|INR)\s*(\d+(?:[.,]\d+)*)
- 分支 1:(?:Rs\.?|INR)
- 匹配Rs
、Rs.
或INR
...\s*
- 后跟 0+ 个空格(\d+(?:[.,]\d+)*)
- 第 1 组:一个或多个数字后跟 0+ 个逗号序列或点后跟 1+ 个数字
|
- 或者(\d+(?:[.,]\d+)*)\s*(?=Rs\.?|INR)
- 分支 2:(\d+(?:[.,]\d+)*)
- 组 2 捕获与分支 1 中相同的数字\s*
- 零个或多个空格(?:Rs\.?|INR)
- 后跟Rs
、Rs.
或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)
)。
关于python - 我想将没有逗号的印度货币的金额与正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38343671/