Python正则表达式被括号([])混淆了?

时间:2010-07-01 18:26:23

标签: python regex

python是混淆的,还是程序员?

我有很多这样的话:

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

我想要做的是将十六进制代码转换为全部大写,如下所示:

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

所以我决定调用正则表达式。通常,我只是使用我的编辑器的regexps(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 个答案:

答案 0 :(得分:7)

re.match匹配字符串的 start 。使用re.search代替“匹配字符串中任何位置的第一个匹配项”。关于此文档的关键点是here

答案 1 :(得分:4)

我认为你不需要括号内的逗号。即:

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

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

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

答案 2 :(得分:4)

您正在使用部分模式,因此您无法使用期望匹配整个输入字符串的re.match。您需要使用re.search,它可以执行部分​​匹配。

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

答案 3 :(得分:2)

你想要改变

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

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

re.match 仅匹配来自字符串开头的,但在“[0x2b]”情况下失败。

re.search 将匹配字符串中的任何位置,从而忽略“[0x2b]”情况下的前导“[”。

有关详细信息,请参阅search() vs. match()

答案 4 :(得分:1)

您想使用re.searchThis explains why.

答案 5 :(得分:1)

如果你使用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'