代码之家  ›  专栏  ›  技术社区  ›  JS.

Python正则表达式被方括号([])弄糊涂了[[副本]

  •  3
  • JS.  · 技术社区  · 14 年前

    是python搞糊涂了,还是程序员搞糊涂了?

    我有很多这样的台词:

    some_dict[0x2a] = blah
    some_dict[0xab] = blah, blah
    

    我要做的是将十六进制代码转换成所有大写字母,如下所示:

    some_dict[0x2A] = blah
    some_dict[0xAB] = blah, blah
    

    所以我决定调用正则表达式。通常,我只需要使用编辑器的regexps(xemacs)来实现这个功能,但是由于需要转换为大写,所以需要将一个转换为Lisp。。。。好 啊。。。那蟒蛇呢?

    所以我编造了一个不起作用的短篇剧本。我已经将代码压缩到这个例子中,但这个例子也不起作用。在我看来,Python的regexp被代码中的括号弄糊涂了。是我还是蟒蛇?

    import fileinput
    import sys
    import re
    
    
    this = "0x2a"
    that = "[0x2b]"
    
    for line in [this, that]:
        found = re.match("0x([0-9,a-f]{2})", line)
    
        if found:
            print("Found: %s" % found.group(0))
    

    (我使用的是()分组结构,因此不会将“0x”中的“x”大写。)

    此示例仅打印0x2a值,而不打印0x2b。这是正确的行为吗?

    我可以通过将匹配表达式更改为:

        found = re.match("\[0x([0-9,a-f]{2}\])", line)
    

    在Linux上运行Python2.6.2。

    6 回复  |  直到 7 年前
        1
  •  7
  •   twasbrillig    10 年前

    re.match 来自 一根绳子。使用 re.search 而是“匹配字符串中任何位置的第一个匹配项”。文档中关于这一点的关键是 here

        2
  •  4
  •   PerilousApricot    14 年前

    我想你不需要括号里的逗号。即。:

    found = re.match("0x([0-9,a-f]{2})", line)
    

    告诉python查找它可能错误匹配的逗号。我想你想要

    found = re.match("0x([0-9a-f]{2})", line)
    
        3
  •  4
  •   jathanism    14 年前

    你用的是部分模式,所以你不能用 re.match re.search ,可以执行部分匹配。

    >>> that = "[0x2b]"
    >>> m = re.search("0x([0-9,a-f]{2})", that)
    >>> m.group()
    '0x2b'
    
        4
  •  2
  •   bvanvugt    14 年前

    found = re.match("0x([0-9,a-f]{2})", line)
    

    found = re.search("0x([0-9,a-f]{2})", line)
    

    将匹配 仅从字符串的开头开始

    检索 在弦的任何地方

    看到了吗 search() vs. match() 详情。

        5
  •  1
  •   Turtle    14 年前
        6
  •  1
  •   PaulMcG    14 年前

    如果您使用re.sub,并传递一个callable作为替换字符串,它还将为您执行大写:

    >>> that = 'some_dict[0x2a] = blah'
    >>> m = re.sub("0x([0-9,a-f]{2})", lambda x: "0x"+x.group(1).upper(), that)
    >>> m
    'some_dict[0x2A] = blah'