在两组交替字符串的重叠出现之间查找字符串

4

我有一些类似于以下字符串:

str1="Quantity and price: 120 units;the total amount:12000.00"
str2="Quantity:100, amount:10000.00"
str3="Quantity:100, price: 10000 USD"
str4="Parcel A: Quantity:100, amount:$10000.00,Parcel B: Quantity:90, amount:$9000.00"
strlist=[str1,str2,str3,str4]

我想在前三个字符串中匹配金额为$12000,$10000和10000,并且在最后一个字符串中匹配$10000和$9000.00。然而,在第一个字符串中既有“price”又有“amount”。我认为使用“|”正则表达式会从左到右搜索,因此我希望正则表达式首先查找“amount”,如果没有出现,则查找“price”。我尝试了以下代码:

amount_p = re.compile(r'(?:amount|price):(.*?)(?:USD|\.00)') 
for i in strlist:
    amount=re.findall(amount_p,i)
    print(amount)
[' 120 units;the total amount:$12000']
['10000']
[' 10000 ']
['$10000', '$9000']

一些方法可以忽略“amount”,仅在第一个字符串中查找“price”。然后我尝试了以下操作:
amount_p = re.compile(r'.*(?:amount|price):(.*?)(?:USD|\.00)') 

这使我

['12000']
['10000']
[' 10000 ']
['$9000']

在这种情况下,正则表达式只匹配了最后一个字符串中的 $9000,并忽略了 $10000。那么我的问题是,.* 在开头的作用是什么,有没有办法解决我的问题?查找数字行不通,因为在我的实际数据中,一段文本中有许多其他数字。 提前感谢大家!

尝试使用 re.findall(r'(?:price|amount):\s*\$?(\d+)(?:\.\d+|\s*USD)', text) 进行匹配(演示 - Wiktor Stribiżew
非常感谢!它运行正常,而且这个网站真的很有用。 - maxyyy
2个回答

1

使用第一个语句:

amount_p = re.compile(r'(?:amount|price):(.*?)(?:USD|\.00)')

你没有正确地分组字符串(我相信你想要按“:”进行分组),因此你的字符串仍然存在于一个组中。你只能从str2和str3中获取数字,因为'.USD'和'.00'帮助你获得了这些数字。
关于第二个语句:
amount_p = re.compile(r'.*(?:amount|price):(.*?)(?:USD|\.00)')

你能够使用':'正确地分割字符串。因此,str1看起来像这样:

部分1: "数量和价格" 和 部分2: "120个单位;总金额:12000.00"

因此,你能够提取你的值。 你可以将其视为执行以下操作:
strlist=[str1.split(';')[1],str2,str3,str4]

当与您的第一个模式组合时,它会产生与第二个相同的结果。

参考:https://www.tutorialspoint.com/python/python_reg_expressions.htm


0

你可以使用

re.findall(r'(?:price|amount):\s*\$?(\d+)(?:\.\d+|\s*USD)', text)

查看正则表达式演示

详细信息

  • (?:price|amount) - 匹配 priceamount
  • : - 一个冒号
  • \s* - 零个或多个空格字符
  • \$? - 一个可选的美元符号
  • (\d+) - 第一组:一个或多个数字
  • (?:\.\d+|\s*USD) -- 一个非捕获组,匹配一个点和一位或多位数字,或者零个或多个空白字符,然后是子字符串 USD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接