【问题标题】:Regex like commands python [closed]正则表达式之类的命令 python [关闭]
【发布时间】:2018-06-04 23:07:44
【问题描述】:

我有这句话:I have 10 bla, 50 blo, 10 blu

我想使用 regex 制作这样的字典:

dictionary = {
    "bla": 10,
    "blo": 50,
    "blu": 10
}

如果我收到了这个短语:I have 50 blo, 5 blu,我会制作 dict,但没有键 bla。像这样:

dictionary = {
    "blo": 50,
    "blu": 5
}

编辑

  • 不同的格式,例如:I want 50 haha, 20 xxx, 17 y、I got 10 xxx, 17 hahaha, 3 xxx。
  • 需要接受十进制数:30.5, 10,5

【问题讨论】:

  • 格式是否总是“我有 x 样东西,y 样东西”
  • 根据句子结构的严格程度,您最好使用自然语言工具包 (NLTK) nltk.org
  • 没有。我收到其他格式,例如:Hey, please, x something, y somethinelse...
  • 这两个示例不足以明确描述模式。除了它们都是可选的之外,您是否总是以相同的顺序拥有相同的三样东西?或者你有很多东西,但它们总是以bl 开头的三个字母的东西?或者只是在一些前缀字符串之后没有任何数字的任何数量的逗号分隔的NUMBER WORD 对?或者…?你要么给我们规则,要么给我们足够的例子来让我们自己弄清楚规则,否则任何人写的任何东西都将是一个疯狂的猜测,并且可能是错误的和无用的。
  • 看起来像是某种餐厅游戏,因此您需要一个包含所有介绍性短语的列表,例如“我想要”“嘿,请”。那么你甚至不需要正则表达式

标签: python regex nlp


【解决方案1】:

假设输入字符串的格式没有偏差,字典理解和re.findall() 应该可以工作:

d = {k: float(v) for (v,k) in re.findall(r"(\d+) (\w+)", s)}

例子:

import re

s = "I have 10 bla, 50 blo, 10 blu"
d = {k: float(v) for (v,k) in re.findall(r"(\d+) (\w+)", s)}
print(d)  # {'bla': 10.0, 'blo': 50.0, 'blu': 10.0}


s = "I have 50 blo, 5 blu"
d = {k: float(v) for (v,k) in re.findall(r"(\d+) (\w+)", s)}
print(d)  # {'blo': 50.0, 'blu': 5.0}

【讨论】:

  • 我也需要准备好获取十进制数字...但这就是答案!
  • 更改 int -> float 就足够了。请注意,如果用户要求“10 foo, 20 bar, 30 foo”(他们要求 foo 两次),结果将是d["foo"] = 30,而不是说 40。如果有可能,请记住这一点
  • 效果很好,谢谢!
猜你喜欢
  • 2015-10-22
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 2020-04-22
相关资源
最近更新 更多