【问题标题】:Extracting keys and values from a string从字符串中提取键和值
【发布时间】:2016-12-19 15:22:26
【问题描述】:

这可能很容易,但我觉得我做错了。 假设我有以下字符串:

user: bob status: married age:45

现在我想将其分解为:

user = 'bob'
status ='married'
age = 45

目前我正在做很多肮脏的拆分工作,但必须有一种更好的 Pythonic 方式使用 Regex。 这是我的工作:

full_text = 'user: bob status: married age:45'
type = 'user'        
cut_string = full_text_string.split(type + ":", 1)[1].split(" ")[0]

谢谢!

【问题讨论】:

  • 使用类似re.findall(r'(\w+):((?:(?!\w+:).)*)', s)
  • :45之间不应该也有空格吗?
  • 哦,哇,这真是太棒了 Wiktor。但是你能解释一下它的作用吗?我想学这个魔术
  • 我认为帕特里克的也应该可以。如果没有,我会发布我的。
  • @PavelZagalsky 未来,regex101.com,包括。 python解释器

标签: python regex split


【解决方案1】:

这是我的解决方案。正则表达式:(\w+)\s*:\s*((?:\w+\b\s*)+)(?!\s*:)

import re 

s = 'user: bob status: married with children age:45'

pat = re.compile(r'(\w+)\s*:\s*((?:\w+\b\s*)+)(?!\s*:)')

print(pat.findall(s))

打印

[('user', 'bob '), ('status', 'married with children '), ('age', '45')]

然后您可以使用 ast.literal_eval 之类的东西来获取正确的类型

【讨论】:

    【解决方案2】:

    re.findall(r'(?:([0-9a-zA-Z]+): ?([0-9a-zA-Z]+))+',s)

    这将回馈:[('user', 'bob'), ('status', 'married'), ('age', '45')]

    第一组是非捕获组,这意味着它不会出现在 findall 的结果中。

    [0-9a-z-A-Z] 部分等同于\w

    【讨论】:

      【解决方案3】:

      对于我们这些尽可能避免使用正则表达式的人:

      >>> full_text='user: bob status: married age:45'
      >>> alt_text = full_text.replace(':',' ').split()
      >>> print alt_text[0],"=",alt_text[1]
      >>> print alt_text[2],"=",alt_text[3]
      >>> print alt_text[4],"=",alt_text[5]
      user = bob
      status = married
      age = 45
      

      如果age:45 之间有一个空格,则不必使用replace,只需full_text.split() 就足够了。

      【讨论】:

        猜你喜欢
        • 2019-11-24
        • 2016-06-24
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多