python中正确的正则表达式模式[已关闭]

i2loujxw  于 2023-02-15  发布在  Python
关注(0)|答案(1)|浏览(192)

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
22小时前关门了。
Improve this question
我试图为我的字符串找到一个合适的正则表达式模式(我很不擅长)。每次我都只能得到部分结果。我将在下面展示我创建的模式,但首先,我想指定我想从文本中提取的内容。
数据:

  • 公司Fragile9完成900万欧元B轮融资
  • Applle21获得1750万加元的股权融资
  • Cat A轮融资1,080万美元
  • Sun以10亿美元的估值筹集3500万欧元资金
  • 日本1337宣布17.8亿日元融资轮

从这些数据中,我只需要提取公司收到的金额(包括$/€等,以及货币的规格,如果它在那里,如加拿大元(CAD))。
所以,结果,我期望收到这个:

  • 900万欧元
  • 加拿大元1750万美元
  • 1 080万美元
  • 3500万欧元
  • 17.8亿日元

我使用的模式(向我扔烂番茄):

try:
    pattern = '(\bAU|\bUSD|\bUS|\bCHF)*\s*[\$\€\£\¥\₣\₹\?]\s*\d*\.?\d*\s*(K|M)*[(B|M)illion]*'
    raises = re.search(pattern, text, re.IGNORECASE) # text – a row of data mentioned above
    raises = raises.group().upper().strip()
    print(raises)
except:
    raises = '???'
    print(raises)

此外,有时在在线python regex编辑器中工作的模式在实际脚本中不起作用。

1zmg4dgp

1zmg4dgp1#

正则表达式中的一些问题:

  • 货币缩写列表(AU USD US CHF)太有限了。它不能匹配日元,也不能匹配许多其他缩写。也许允许任何2 - 3个大写字母的单词。
  • 不是问题,但是没有必要用反斜杠转义货币符号。
  • 货币列表中的\?不是货币符号。
  • 正则表达式要求 * both * 货币缩写作为货币符号。也许你想用\?使货币符号 * optional *,但是?应该出现在字符类之后,并且仍然有可能没有缩写而只有符号。
  • 正则表达式 * 要求 * 数字必须有小数。这应该是可选的。
  • (K|M)*将允许KKKKKKK。您不希望在此处使用*
  • [(B|M)illion]*将允许字母BMilon、文字管道和文字括号以任何顺序和任何数字出现。就像它将匹配"in"、"non"和"(BooM)"一样
  • 前面提到的两种模式是按顺序排列的,但它们应该是互斥的。
  • 正则表达式不提供匹配"百万"中最后的"s"。

以下是更正:

(?:\b[A-Z]{2,3}\s*[$€£¥₣₹]?|[$€£¥₣₹])\s*\d+(?:\.\d+)?(?:\s*(?:K|[BM](?:illions?)?)\b)?

regex101
在Python语法中:

pattern = r"(?:\b[A-Z]{2,3}\s*[$€£¥₣₹]?|[$€£¥₣₹])\s*\d+(?:\.\d+)?(?:\s*(?:K|[BM](?:illions?)?)\b)?"

相关问题