使用正则表达式替换找到的项目。

时间:2012-12-19 10:28:08

标签: python regex python-2.6

首先我搜索数字,然后用regexp替换find。

然后获取更改后的字符串(?)并搜索空格并将其替换为regexp。

但是我得到了错误的结果。

test0 = This book id 0076 has 6782e6a
test1 = This book id 0076 has 0xef34a

我使用了以下正则表达式:

b = re.sub(r"(0x[a-fA-F0-9]+|\d+)","[0-9]*", test0)
c = re.sub(r'[(\s)*]','[^\s"]*',b)

我的输出:

test0
b = This book id [0-9]* has [0-9]*e[0-9]*a
c = This[^\s]*book[^\s]*id[^\s]*[0-9][^\s]*[^\s]*has[0-9][^\s]*e[0-9][^\s]*a

test1
b = This book id [0-9]* has [0-9]*
c = This[^\s]*book[^\s]*id[^\s]*[0-9][^\s]*[^\s]*has[0-9][^\s]*

预期产出:

test0
b = This book id [0-9]* has [0-9]*
c = This[^\s]*book[^\s]*id[^\s]*[0-9]*[^\s]*has[^\s]*[0-9]*

test1
b = This book id [0-9]* has [0-9]*
c = This[^\s]*book[^\s]*id[^\s]*[0-9]*[^\s]*has[^\s]*[0-9]*

4 个答案:

答案 0 :(得分:0)

在第二次阅读时,我意识到你错过的是\s匹配xf中的0xf位,实际上是任何十六进制字符串。

虽然我不确定你要做什么,但也许你需要在re.match中使用分组来避免匹配hex的字符串位,例如:

In [16]: re.match("(0x[0-9a-fA-F]+)(hello)", "0xfhello").groups()
Out[16]: ('0xf', 'hello')

OLD

看起来第二轮数字可能是十进制[0-9] +或十六进制0x [0-9a-fA-F] +所以你的正则表达式应该是这样的:

([0-9]+)|(0x[0-9a-fA-F]+)

然而,如果你匆忙,你可能会把两者都折叠成一个不精确的正则表达式:

[0-9a-fA-Fx]+

答案 1 :(得分:0)

正则表达式"(0x[a-fA-F0-9]+|\d+)"中的第二个匹配选项与字符串"6782e6a"匹配两次,为您提供输出"[0-9]*" + "e" + "[0-9]*" + "a"

我建议您将正则表达式更改为"(?:0x)?[A-Z-a-Z0-9]+"

答案 2 :(得分:0)

第一个正则表达式可以是(?<=\s)(0x)?[0-9a-fA-F]+(?=\s|$)

string中的第二个数字是十六进制数,前面没有0x。如果确定只有十六进制数字以0x开头,那么它可以是(0x[0-9a-fA-F]+)|\d+

存在一个问题:如果你没有在十六进制数字之前放置0x,那么该模式最终可能会匹配英语单词coffeecafedead您应该在十六进制值之前加上0x

第二个可以是(\s)+。当您在[]之间放置正则表达式时,其中的所有字符都被视为不同。 [ab]表示ab的单个实例。这就是为什么你的正则表达式用(\s)替换*[^\s]两次。

答案 3 :(得分:0)

如果你的字符串具有相同的格式,你也可以使用正面的lookbehind断言,只选择'id''has'之后的标记。那么你就不必提出复杂的正则表达式。

这里有类似的东西:

>>> a = 'This book id 0076 has 6782e6a'
>>> b = re.sub(r'(?<=id\s)\w+', '[0-9]*', a)
>>> b
'This book id [0-9]* has 6782e6a'
>>> c = re.sub(r'(?<=has\s)\w+', '[0-9]*', b)
>>> c
'This book id [0-9]* has [0-9]*'
相关问题