首先我搜索数字,然后用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]*
答案 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
,那么该模式最终可能会匹配英语单词coffee
,cafe
,dead
您应该在十六进制值之前加上0x
。
第二个可以是(\s)+
。当您在[
和]
之间放置正则表达式时,其中的所有字符都被视为不同。 [ab]
表示a
或b
的单个实例。这就是为什么你的正则表达式用(\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]*'