Python 正则表达式被括号([])困惑?
是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
。文档中关于这点的关键内容可以在 这里 找到。