【问题标题】:Matching anything but a letter - regex匹配除字母以外的任何内容 - 正则表达式
【发布时间】:2013-02-27 05:05:39
【问题描述】:

如何匹配除字母以外的任何内容?我以为[^a-z]+ 会做,但不是真的。

我有这个字符串要搜索:

"price":"7.99","opt":{"1":[1.01,1.02]},"mixedId":0,"price":"8.99","opt":{"3":[1.03],"4":[1.04,1.05]}

我想获取这些值 8.991.04,1.05 但它无法匹配 7.99

我是这样做的:

'"price":"(.+?)","opt":\{"[^a-z]*"4":\[(.+?)]'

但它什么也没找到。需要一些支持:)

【问题讨论】:

  • 您的意思是匹配除数字以外的所有内容? regex101.com/r/nJ5qP8 ?
  • 您的数据几乎看起来像 JSON(除了双 "price" 键和缺少的外部 { .. } 大括号。为什么将其作为字符串搜索?为什么不将其解释为 JSON?跨度>
  • 感谢您的回答! @kaᵠ 这个网站看起来很棒,谢谢一百万。 @Martijn,据我所知,这不是 JSON,而是简单的文本/html。 @Rob 啊,我想得到1.04,1.05 而不是1.01,1.02,谢谢您指出这一点。

标签: python regex python-2.7


【解决方案1】:

您的固定正则表达式应如下所示:

"price":"([\d\.]+?)","opt":\{"[^a-z]*"4":\[(.+?)\]

现场演示:http://regex101.com/r/iU3oT7

【讨论】:

    【解决方案2】:

    以下正则表达式将匹配您想要的(数字和句点),包括“1”:

    [\d\.]+
    

    如果您只想匹配包含句点和两位小数的数字,您可以使用以下模式:

    \d+\.\d{2}
    

    【讨论】:

    • 但是: 呢?我仍然需要匹配那些。
    【解决方案3】:
    import json
    
    def handle_duplicates(pairs):    
        d = {}
        for k, v in pairs:
            if k in d:
               d[k].append(v)
            else:
               d.setdefault(k,[]).append(v)
        return d
    
    s = '{"price":"7.99","opt":{"1":[1.01,1.02]},"mixedId":0,"price":"8.99","opt":{"3":[1.03],"4":[1.04,1.05]}}'
    
    d = json.loads(s, object_pairs_hook=handle_duplicates)
    print d
    

    出来:

    {u'mixedId': [0],
     u'opt': [{u'1': [[1.01, 1.02]]}, {u'3': [[1.03]], u'4': [[1.04, 1.05]]}],
     u'price': [u'7.99', u'8.99']}
    

    因为你现在有一个字典,你可以得到像d['price']这样的价目表

    【讨论】:

    • 非常感谢您的详细解释。我将不得不深入研究 json,因为这看起来很方便。谢了!
    【解决方案4】:

    要匹配不是字母的所有内容(如原始问题中所示),请使用此字符类,它是对 \w 的修改,来自 the documentation

    [^a-zA-Z]
    

    从后续的cmets看,听起来你对类似于@Mauritz Hansen的这个字符类的第1组更感兴趣:

    '\[([\d\.,]*)\]
    

    我很困惑您所说的“我也需要匹配:”是什么意思。此 Python 代码查找 1.011.05 的价格:

    import re
    
    txt = '"price":"7.99","opt":{"1":[1.01,1.02]},"mixedId":0,"price":"8.99","opt":{"3":[1.03],"4":[1.04,1.05]}'
    
    pattern = '\\[([\d\\.,]*)\\]'
    
    for m in re.finditer(pattern2, txt):
        print m.group(1)
    

    输出:

    1.01,1.02
    1.03
    1.04,1.05
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 2022-12-09
      • 2019-02-15
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      相关资源
      最近更新 更多