作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想匹配 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/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!