繁体   English   中英

在文本中搜索部分字符串并从匹配模式上方和下方的行中提取数字

[英]Search for a partial string in text and extract numbers from lines above and below the matched pattern

我正在尝试编写一个正则表达式,它将根据字符串进行搜索,如果它找到了部分匹配项。 我可以从匹配字符串或 substring 上方和下方的行(2 行)中提取数字。

我的文字是:

Subtotal AED1,232.20
AED61.61
VAT
5 % Tax:
RECEIPT TOTAL: AED1.293.81

我希望搜索VAT一词并从其上下两行中提取所有数字。

预期 output:

AED1,232.20
AED61.61
5 % 
AED1.293.81

我可以提取全部内容,但我需要数字,可以删除或忽略 AED。

我的正则表达式是:

((.*\n){2}).*vat(.*\n.*\n.*)

提前致谢!

尝试这个:

(?:[a-zA-Z:]*([0-9,.]+)[a-zA-Z:]*)\n(?:[a-zA-Z:]*([0-9,.]+)[a-zA-Z:]*)\nVAT\n(?:[a-zA-Z:]*([0-9,.]+)[a-zA-Z:]*).*\n[^0-9]*(?:[a-zA-Z:]*([0-9,.]+)[a-zA-Z:]*)

这个正则表达式可能看起来太复杂或太长,但它有更好的控制并且只返回数字,这将是他的工作。

正则表达式演示

您可以在python中使用此正则表达式:

((?:^.*\d.*\n){0,2})VAT((?:\n.*\d.*){0,2})

正则表达式演示

正则表达式详细信息:

  • ((?:^.*\d.*\n){0,2}) :匹配 2 条必须包含至少一个数字的前导行
  • VAT :匹配文本VAT
  • ((?:\n.*\d.*){0,2}) :匹配必须至少包含一个数字的 2 个尾随行

此正则表达式是为您的输入文本和预期的 output 量身定制的:

r'.* (AED\d{1,3}(?:,\d{3})*\.\d{2})\n(AED\d{1,3}(?:,\d{3})*\.\d{2})\nVAT\n(\d{1,2} %) Tax:\n.* (AED\d{1,3}(?:,\d{3})*\.\d{2})'

您需要的正则表达式

它准确地输出您想要的文本,没有多余的单词。

它还适用于输入文本中的多个“增值税”。

正则表达式逻辑:

  • (AED\d{1,3}(?:,\d{3})*\.\d{2})匹配货币代码和金额(在一组中)
  • (\d{1,2} %)匹配增值税百分比。 支持 1 到 2 位数字。 您可以进一步增强它以支持小数点。

请注意,货币金额的正确正则表达式(以逗号作为千位分隔符,正好有 2 个小数点)应如下所示:

r'\d{1,3}(?:,\d{3})*\.\d{2}'

[使用 (?: expr) 表示未标记的组,以便该子组不会被标记为与您的 re.findall function 调用匹配。]

如果您的输入支持“AED”以外的货币代码,您可以将“AED”替换为 [AZ]{3},因为货币代码通常应为 3 个字符的大写字母。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM