【问题标题】:How to replace "$10" with "10 dollars" using regex?如何使用正则表达式将“$10”替换为“10 美元”?
【发布时间】:2021-12-30 00:47:52
【问题描述】:

我有一些像下面这样的短语:

This is not my spending '$10', this is companys spending: '$250 million' and this is some other figure: '$200,000'.

我想删除美元符号并在短语末尾添加“美元”,如下所示:

This is not my spending '10 dollars', this is companys spending: '250 million dollars' and this is some other figure: '200000 dollars'.

我现在有正则表达式来匹配 ([£\$€][\s\d,\d]+(|million|billion|trillion)),但我无法正确地得到替换部分。

我该怎么做?

【问题讨论】:

  • 在每个短语的开头总是有一个 $?
  • 您可以使用 re.sub 将初始字符串中的所有符号替换为“”,然后在末尾添加美元?
  • Naveen,比较您的预期输出,我认为您还需要删除任何作为千位分隔符的逗号,对吧?您的回答中没有提到它,并且在回答时只考虑预期的输出可能不会被其他用户理解,并且有时会导致不受欢迎的行为。请详细说明您的要求。另外,请说明您是否要将 替换为euros,将£ 替换为pounds
  • 是的,@LidorEliyahuShelef,$ 总是出现在数字之前。
  • @NaveenReddyMarthala 我可以看到有人已经给了您答案,如果您需要更多帮助,请编辑您的问题或提出其他问题并告诉我们 :)

标签: python python-3.x regex re


【解决方案1】:

您可以使用以下功能来实现您所描述的。

import re

def adjust_dollars(text):
  text = re.sub(r'^\$', '', text)
  text = re.sub(r'(.$)', r'\1 dollars', text)
  return text

试运行:

words = ['$10', '$250 million', '$200,000']
result = map(adjust_dollars, words)
print(list(result))

输出:

['10 dollars', '250 million dollars', '200,000 dollars']

【讨论】:

  • 因为我的问题是关于替代的,所以我选择了这个答案。对于美元,正则表达式是([\$])([ \.,\d]+)(million|billion|trillion|)(受托比亚克的回答启发),替换是\2 \3 dollars 。更多:regex101.com/r/qmKFVj/1
【解决方案2】:

只是一个 re.sub 的例子:

t1 = "$10"
t2 = "$250 million"
t3 = "$200,000"

sub_pattern = "/$|," #Look for dollar signs or commas
tail = " dollars"
re.sub(sub_pattern,"",t1) + tail -> 10 dollars
re.sub(sub_pattern,"",t2) + tail -> 250 million dollars
re.sub(sub_pattern,"",t3) + tail -> 200000 dollars

【讨论】:

  • 因此,如果您可以使用 match 找到需要更改的字符串部分。您可以根据需要使用 re.sub 用一些替换来替换字符串模式。例如,考虑使用条件检查将尾部替换为美元、欧元或英镑。
【解决方案3】:

由于您的正则表达式还包括英镑和欧元的符号,我假设并非所有这些符号都以 $ 开头。然后您可以使用re.sub 和回调函数来确定要使用的货币。如果货币出现在文本的中间,这也有效。

import re
p = "([£\$€])\s?([,\d]+(?: million| billion| trillion|))"
d = {"$": "dollars", "£": "pounds", "€": "euros"}

text = "I have $10 and £3 million and €100,000 trillion"
print(re.sub(p, lambda m: f"{m.group(2)} {d[m.group(1)]}", text))
# I have 10 dollars and 3 million pounds and 100,000 trillion euros

还要注意正则表达式的一些细微变化:我将货币符号放在一个组中,以便以后可以访问它,并将“空”后缀放在末尾,否则它会被贪婪地首先匹配,其他的都不匹配。另外,\d不用在[...]中放两次,最好把空格移到后缀部分。

【讨论】:

    【解决方案4】:

    如果所有字符串都以“$”开头,则不需要使用正则表达式。只需使用“[1:]”在第二个字符处选择它们并在末尾添加“美元”。例如,如果您的字符串存储在名为 a 的变量中:

    a[1:] + " dollars"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多