我想匹配 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))))
但是在金额之后,它与inr
或rs
的数字不匹配
我想在Python中使用re库来匹配它。
答案 0 :(得分:3)
我建议在内部使用带有捕获组的交替组,只匹配常量字符串值之前或之后的数字:
(?: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)
)。
答案 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
)
(?|
(?¤cy1)
(?P<money>(?&amount))
|
(?P<money>(?&amount))
(?=\ (?¤cy2))
)
""", 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+))