Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 匹配除模式外的所有内容,并替换为字符串匹配_Python_Regex_String - Fatal编程技术网

Python 匹配除模式外的所有内容,并替换为字符串匹配

Python 匹配除模式外的所有内容,并替换为字符串匹配,python,regex,string,Python,Regex,String,我想使用python来操作我拥有的字符串。 基本上,我想在每个十六进制字节之前加上“\x”,但已经加上“\x”的字节除外 我的原始字符串如下所示: mystr = r"30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00" 我想从中创建以下字符串: mystr = r"\x30\x33\x62\x37\x

我想使用python来操作我拥有的字符串。
基本上,我想在每个十六进制字节之前加上“\x”,但已经加上“\x”的字节除外

我的原始字符串如下所示:

mystr = r"30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00"
我想从中创建以下字符串:

mystr = r"\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00"

我想用正则表达式匹配除/\x../g之外的所有内容,并用“\x”替换所有匹配项。可悲的是,我与它斗争了很多,但没有任何成功。此外,我不确定使用正则表达式是否是解决这种情况的最佳方法。

您不需要正则表达式。您可以使用简单的字符串操作。首先从字符串中删除所有
“\x”
。然后每2个字符添加一次

replaced = mystr.replace(r"\x", "")
newstr = "".join([r"\x" + replaced[i*2:(i+1)*2] for i in range(len(replaced)/2)])
输出:

>>> print(newstr)
\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00
正则表达式替换
\\x$1

详细信息

import re

text = R'30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00'
text = re.sub(R'(?:\\x)?([0-9A-Z]{2})', R'\\x\1', text)
print(text)
\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00
  • (?:)
    非捕获组
  • 在零和一次之间匹配,匹配字符串
    \x
    (如果存在)
  • ()
    捕获组
  • []
    匹配列表中的单个字符
    0-9
    a-Z
  • {n}
    精确匹配
    n
  • \\x
    String\x
  • $1
    第一组
Python代码

import re

text = R'30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00'
text = re.sub(R'(?:\\x)?([0-9A-Z]{2})', R'\\x\1', text)
print(text)
\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00
输出

import re

text = R'30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00'
text = re.sub(R'(?:\\x)?([0-9A-Z]{2})', R'\\x\1', text)
print(text)
\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00

您可以获得一个包含您的值的列表,以便按照您的意愿进行操作,并使用更简单的重新模式

mystr = r"30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00"

import re

pat = r'([a-fA-F0-9]{2})'
match = re.findall(pat, mystr)

if match:
    print('\n\nNew string:')
    print('\\x' + '\\x'.join(match))
    #for elem in match: # match gives you a list of strings with the hex values
    #    print('\\x{}'.format(elem), end='')

print('\n\nOriginal string:')
print(mystr)

这可以在不替换现有的
\x
的情况下通过使用正向lookbehind和反向lookahead的组合来完成

(?!(?<=\\x)|(?<=\\x[a-f\d]))([a-f\d]{2})

(?!(?谢谢!介意解释第一部分,直到第二部分吗?)?优雅的回答,我喜欢!谢谢!