Python 正则表达式被括号([])困惑?

3 投票
6 回答
3059 浏览
提问于 2025-04-16 00:41

是Python搞不清楚状况,还是程序员搞不清楚呢?

我有很多这样的代码:

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

我想把这些十六进制代码都转换成大写,像这样:

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

所以我决定用正则表达式来处理。通常,我会用我编辑器里的正则表达式(xemacs)来做这个,但因为需要转换成大写,所以我得用Lisp来搞。……好吧,那Python怎么样呢?

于是我写了一个小脚本,但它没有成功。我把代码简化成这个例子,但这个也不行。看起来Python的正则表达式被代码里的括号搞糊涂了。是我搞错了,还是Python的问题呢?

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上运行的是Python 2.6.2。

6 个回答

4

我觉得在括号里面不需要逗号,也就是说:

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

这段代码是让Python去查找逗号,可能会出现错误匹配。我想你想要的是

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

你正在使用一个部分模式,所以不能用 re.match,因为它是用来匹配整个输入字符串的。你需要使用 re.search,它可以进行部分匹配。

>>> that = "[0x2b]"
>>> m = re.search("0x([0-9,a-f]{2})", that)
>>> m.group()
'0x2b'
7

re.match 是从字符串的 开头 开始匹配的。如果你想要在字符串中“找到第一次出现的地方”,可以用 re.search。文档中关于这点的关键内容可以在 这里 找到。

撰写回答